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