[Armadillo:05022] Re: char array initialization in C (was: CON16 (シリアルインターフェース1)のリブート時のメッセージ抑制)

Yasuhisa Nakamura email@hidden
2010年 3月 13日 (土) 00:55:31 JST


中村です。

[Armadillo:05020]でyashiさんwrote:
> 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.
> 	(以下省略)
>
> とあります。なので、経緯は知りませんが、許された書きかたみたいですね。

yashiさん、ありがとうございます。

#6.7.9は、6.7.8のようです。


> ちなみに、
>
> 	#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
>
> という結果が出ておもしろいですね。

長いですがそのまま引用させていただいて。。。。

(昨晩[Armadillo:05016]で書いた「簡単なテストコード」というのも
これとほとんど同じようなのを書いてましたが、)
これも面白いですよね。

char a[] と char *a は同じなんて解説を見かけますが、
char[]は入れ物なので実体が異なり、char* の場合は同じ文字列は
1つにまとめられてみな同じ。。。と。

char *str0 = "console=ttyAM0,115200";
char *str1 = "console=ttyAM0,115200";
というように異なる変数で同じ文字列で初期化したものに対して、
hermitのコードにもあるようなやり方で、str1だけ変えるつもりで
    str1[13] = '1';
なんてことをやってしまうと、アウトですね。
(hermitのコードはchar[]ですし1つしかないので大丈夫ですが)


totoさんの質問から完全に脱線してしまい、すみません。

-- 
なかむら




armadillo メーリングリストの案内