予期せぬ文字配列の初期化とのやりとりがあります。C - strlenを使って配列を初期化する配列が間違っています
strlen(charパラメータ[])のサイズでchar []を初期化すると、新たに初期化されたchar []が大きすぎます。私はこれを引き起こしているのか分かりません。私がfooにprint文を追加したとき
int main(void)
{
char myString[] = { " " };
foo(myString);
}
int foo(char str[])
{
char testString[ strlen(str) ];
printf("Length of testString: %lu\n", strlen(testString));
return 0;
}
私がfooを実行すると、出力は
Length of testString: 6
である私はそれが1
ことさえ知らない人期待していていますtestStringの初期化の前に、出力は魔法のように修正されるようです:
int foo(char str[])
{
printf("Length of str: %lu\n", strlen(str));
char testString[ strlen(str) ];
printf("Length of testString: %lu\n", strlen(testString));
return 0;
}
fooが、今、私はそれがchar []は機能、または多分strlen関数の予期しない動作に渡されますが、私は本当にありません持っている方法とは何かを持っていることを感じている
Length of str: 1
Length of testString: 1
を印刷しますアイディア。
何か助けていただければ幸いです。
um ...あなたは 'testString'配列をまったく初期化していません。サイズを指定しましたが、配列そのものは初期化されずに残っています。それはゴミを含んでいます。初期化されていない配列に 'strlen'を適用しようとすると、動作が未定義になります。それはあなたが観察していることです。そして、はい、未定義の振る舞いは予測できない振る舞いをする可能性があり、 "魔法のように自分自身を修正する"ように見えるかもしれません。 – AnT
http://stackoverflow.com/questions/16381307/strlen-of-a-char-array-is-greater-than-its-size-how-to-avoid –