は、このテストプログラムを見るなぜできるのallocaの範囲へのI後藤:D変数ではなく、可変長配列?
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc < 2)
goto end;
char s[strlen(argv[1]) + 1];
strcpy(s, argv[1]);
printf("s=%s\n", s);
end:
return 0;
}
は、エラー(other question参照)「可変変性タイプと識別子の範囲にジャンプ」でコンパイルすることができません。
私はこれにs
の宣言を変更(およびalloca.h
を含む)にあれば、それは罰金コンパイルしかし:
char *s = alloca(strlen(argv[1]) + 1);
なぜC標準はalloca
で作成されたオブジェクトの範囲に飛び込むことができないではなく、可変長配列?私は彼らが同等だったと思った。
VLAの範囲を分岐するとスタックが混乱しますが、 'sizeof(char *)'は固定されているため、手を振って答えます。まともな答えを得るチャンスを増やすために弁護士のタグを追加しました。 – Bathsheba
ありがとう、言語弁護士は間違いなく適用されます。もし私が推測しなければならないのは、 'alloca'を飛び越えて' s'を使うのは 's'が初期化されていないポインタなので既にUBだが、VLA宣言を飛び越して' s'を使うのは、ジャンプ自体は禁止されていませんでした。 –
'alloca'は標準ではないので、コンパイラは他の関数と同じように扱うことができます(ただし、しばしばそうしません)(http://man7.org/linux/man-pages/man3/alloca.3 .html#NOTES))、その場合は標準ですべて問題ありません。もちろん、同様の未定義の動作につながる可能性があります。 – Kninnug