GCCのステートメントエクスプレッションエクステンションについて読みましたが、使用時に予期しない動作が発生しました。GCCステートメントの表現の問題
この例を守ってください:
#include <stdio.h>
int main(void)
{
char* res1 = ({
char arr[] ={'h', 'e', '\0'}; // was char *arr[]
arr[0] = 'x';
char* ptr = arr;
ptr;
});
char* res2 = ({
char arr[] ={'h', 'e', '\0'}; // was char *arr[]
arr[0] = 'X';
char* ptr = arr;
ptr;
});
printf ("%s %p\n", res1, res1);
printf ("%s %p\n", res2, res2);
return 0;
}
出力:私はそれに気付い
X 0x7fff93098160
X 0x7fff93098160
、第二ブロックの最初のブロック内の変数arr
とarr
が同じメモリアドレスを取ります。
なぜそれが起こっていますか?
申し訳ありませんが、私は間違ったコードをコピーして貼り付けましたが、修正しました。 –
訂正されたコードが問題になっており、ここではもう必要ないので、私は自分の答えを編集しました。 –
保存期間が自動であることを確認するための参考資料はありますか?完全表現の終わりなどはありませんか? [この質問で来た](http://stackoverflow.com/questions/40486940/declare-an-array-in-gcc-statement-expression-and-return-a-pointer-to-it)。 gccの公式のdocページではこれは言わなかった。 –