[Armadillo:05020] char array initialization in C (was: CON16 (シリアルインターフェース1)のリブート時のメッセージ抑制)
Yasushi SHOJI
email@hidden
2010年 3月 12日 (金) 14:16:07 JST
At Fri, 12 Mar 2010 01:12:03 +0900 (JST),
Yasuhisa Nakamura wrote:
>
> 元ソースの
> char console[] = { "console=ttyAM0,115200" };
> この文字列初期化の書式(構文)が気になっています。
>
> 普通は
> char console[] = "console=ttyAM0,115200";
> こう書きますよね?
>
> 中カッコは
> char *str[]= { "abc", "xyz" };
> のようなときに使うかと。。。
>
> (要素1つの配列は意味がなさそうですが)上のconsoleだと
> char *console[] = { "console=ttyAM0,115200" };
> が言語仕様的には正しいと思うのですが、元ソースの
> ままでgccに"-W"や"-Wall"をつけても警告は出ません。
>
> 簡単なテストコードを書いてgccで試してみたところ、
> どちらでもconsoleには同じ値が入るようです。
>
> どなたか、根拠(Cの言語仕様)がわかる方がいましたら
> 教えてください。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
の、6.7.9 Initializationに
14 An array of character type may be initialized by a
character string literal, optionally enclosed in braces.
(以下省略)
とあります。なので、経緯は知りませんが、許された書きかたみたいですね。
ちなみに、
#include <stdio.h>
int main()
{
char a[] = { "console=ttyAM0,115200" };
char b[] = "console=ttyAM0,115200";
char c[] = "console=ttyAM0,115200";
char *d = "console=ttyAM0,115200";
char *e = { "console=ttyAM0,115200" };
char *f[] = { "console=ttyAM0,115200" };
printf("a: %p: %s\n", a, a);
printf("b: %p: %s\n", b, b);
printf("c: %p: %s\n", c, c);
printf("d: %p: %s\n", d, d);
printf("e: %p: %s\n", e, e);
printf("f: %p: %s\n", f[0], f[0]);
return 0;
}
を実行してみると
a: 0x7ffffa3b7920: console=ttyAM0,115200
b: 0x7ffffa3b7900: console=ttyAM0,115200
c: 0x7ffffa3b78e0: console=ttyAM0,115200
d: 0x40072c: console=ttyAM0,115200
e: 0x40072c: console=ttyAM0,115200
f: 0x40072c: console=ttyAM0,115200
という結果が出ておもしろいですね。
--
yashi
armadillo メーリングリストの案内