以下のコードを参照してください。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[1000];
int i;
for(i = 1;i<1000;i++)
{
a[i] = 5;
}
printf("%d\n",strlen(a));
return 0;
}
結果は 0 です。なぜですか? 任意の説明をいただければ幸いです。
を割り当てたり初期化したりすることはありませんa[0]
。この場合、たまたま だったので'\0'
、strlen(a)
0 を返します。
null ターミネータを見つけるための検索の最初のステップとして、初期化されていないガベージ メモリを間接的に読み取ろうとしているため、ここでの呼び出しは未定義の動作でstrlen
あることに注意してください。それを明示的に 0 に設定しても、0 が見つかるか、クラッシュするか、爆発するまで、配列の最後から実行されるという問題が発生します。a
a[0]
strlen()は、1ではなく0からカウントを開始します。これを行うと、次のようになります。
for(i = 0; i <1000; i ++)
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[1000];
int i;
for(i = 0;i<1000;i++)//starts with 0 not 1
a[i] = 5;
a[i] = '\0';//NULL terminator shall be there
printf("%d\n",strlen(a));//1000
return 0;
}