[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 メーリングリストの案内