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.

在这种情况下,您的编译器似乎已经为nameafter放置了内存name1,这就是为什么它们都被打印(name正确NULL终止,就像所有文字一样)。

于 2012-08-24T19:46:04.637 回答
1

name1不是以空值结尾的,因此printf只需继续打印字符直到\0达到 a 。

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

s转换说明符要求参数是指向 C 字符串的指针。

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

不是 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 回答