9

私はそれを読みました;

複合リテラルは、名前のない配列を作成するために使用できる C99 機能です。例を考えてみましょう:

int *p = (int []){3, 0, 3, 4, 1};

p3, 0, 3, 4、およびを含む 5 要素配列の最初の要素を指し1ます。

実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?
つまり、

char* str = "hello"

文字列"hello"はメモリのどこに保存されますか?

4

4 に答える 4

9

ポインター演算の使用。そう

p[0], p[1], ...

また

*p, *(p + 1), ...

つまりね。C では、 や などのプリミティブ型intchar、文字列リテラルの優れたリテラルがあります。したがって、次のようなことを簡単に言うことができます

int length(char *s);
int len = length("Hello, World!");

C99では、「配列リテラル」と「構造体リテラル」を扱うために、複合リテラルの概念が追加されました。したがって、次のようなことが言えます。

int sum(int a[], int n);
int total = sum((int []){ 17, 42 }, 2);

これは、複合リテラルを使用して「配列リテラル」を表しています。

実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?

はい、記憶に。

あなたの混乱はこれからだと思います。p名前があります。(int []){3, 0, 3, 4, 1}ではない。pの値が のアドレスになるのはたまたまです(int []){3, 0, 3, 4, 1}。もちろん(int []){3, 0, 3, 4, 1}、記憶に残っています。実行可能ファイルのデータ セグメントになります。あなたはそれを参照する名前を持っていません。

于 2013-07-26T20:19:08.970 に答える
0

ふたつのやり方:

&((int[]){3,0,3,4,1})[3]

((int[]){3,0,3,4,1})+3

リテラルが関数内にある場合、囲んでいるブロックが終了すると、リテラルへのポインターが無効になることに注意してください。

于 2013-07-26T20:23:31.877 に答える