以下のこのコードの出力abcdef def
がabc def
.
main()
{
char array1[3]="abc";
array1[3]='\0';
char array2[3]="def";
array2[3]='\0';
printf("%s %s", array1, array2);
}
あなたのコードで
main()
{
char array1[3]="abc"; //Undefined ,when you access this using printf() with %s
array1[3]='\0'; //here you are storing value which is out of bound in nature
char array2[3]="def"; //same as above
array2[3]='\0'; //same as above
printf("%s %s", array1, array2);
}
memory:
---------------
| a | b | c |\0|
----------------
最後の \0 は、割り当てたスペースを超えています。
解決:
main()
{
char array1[4]="abc";
//array1[3]='\0'; //no need
char array2[4]="def";
// array2[3]='\0'; //no need
printf("%s %s", array1, array2);
}
それは望ましい出力を与えるでしょう
これはとても悪いコードです!何が起こっているかは次のとおりです。
コンパイラは 2x3 文字にスペースを割り当てました。
main()
{
char array1[3]="abc"; //Will write "abc" in array 1 AND \0 in array2[0]
array1[3]='\0'; //Out of array!!! (Re)writing \0 in array2[0]
char array2[3]="def"; //Will write "def" in array2 AND \0 after array2 space, POTTENCIALLY corrupting code!
array2[3]='\0'; //\0 (re)wrote after array2, POTTENCIALLY corrupting code!
メモリにあるのは 7 バイトです (割り当てられたのは 6 バイトだけです): "abcdef\0"。ポイントは問題ありません: array1 は "a" をポイントし、array2 は "d" をポイントします。C 標準ライブラリでは、文字列のサイズは末尾のゼロ ターミネータによって決まります。したがって、array1 を printf すると、\0 まで "abcdef" と表示されます。