1

このコード出力の異常な動作を理解できません。それは印刷します:

 hellooo
monusonuka

コードはここにあります:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
printf(" hellooo \n");
char name[7]="sonuka";
char name1[4]={'m','o','n','u'};
printf("%s",name1);
system("pause");
return 0;
}
4

5 に答える 5

6

name1配列はゼロ文字()で終了していません'\0'。このprintf関数は、ゼロが見つかるまで文字を出力します。あなたの場合、それは配列の終わりを超えます。何が起こるかは未定義の振る舞いです。考えられる結果は、最終的にメモリ内の別の場所にヒットするまで、他の変数またはガベージが画面に出力されること\0ですが、プログラムのクラッシュを含む何かが発生する可能性があります。

于 2012-08-24T19:46:03.980 に答える
3

name1 NULLで終了する必要printfがあります。そうでない場合は、がヒットするまで、検出された数のバイトを出力します\0

それは違いない

char name1[5]={'m','o','n','u', '\0'};

あなたが持っているのは未定義の振る舞いです:printfメモリの後にメモリを出力し、に割り当てられname1ます。

この場合、コンパイラがname後のメモリを配置しているように見えます。name1そのため、両方が出力されます(すべてのリテラルがそうであるように、name正しく終了します)。NULL

于 2012-08-24T19:46:04.637 に答える
1

name1はnullで終了しないため、aに達するprintfまでcharを出力し続けます。\0

于 2012-08-24T19:46:07.243 に答える
1
 printf("%s",name1);

s変換指定子では、引数がC文字列へのポインターである必要があります。

char name1[4]={'m','o','n','u'}; 

配列がnullで終了していないため、はC文字列ではありません。変換スペシャリストの要件に違反すると、未定義の動作が発生します。これが、この予期しない結果が発生する理由です。

于 2012-08-24T19:46:07.490 に答える
0

printfを使用してchar配列を文字列として出力しようとしています。このコードを試してください:

int pointer=0;
while(pointer < 4){
     printf("%c",name1[pointer]);
     pointer++;
}
于 2012-08-24T19:48:16.693 に答える