在c ++中出现这种异常输出的原因

时间:2012-08-24 19:44:09

标签: c++ printf

我无法理解此代码输出的异常行为。 它打印:

 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;
}

5 个答案:

答案 0 :(得分:6)

您的name1数组未以零字符('\0')终止。 printf函数打印字符,直到找到零。在你的情况下,它超过了数组的末尾。会发生什么是未定义的行为。可能的结果是其他变量或垃圾被打印到屏幕上,直到内存中的其他位置\0最终被击中,但任何事情都可能发生,包括程序崩溃。

答案 1 :(得分:3)

name1 必须以NULL结尾,否则printf将打印尽可能多的字节,直到点击\0

一定是

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

你所拥有的是未定义的行为printf在内存之后打印内存,分配给name1

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

答案 2 :(得分:1)

name1不会以空值终止,因此printf只会保持打印字符,直到达到\0

答案 3 :(得分:1)

 printf("%s",name1);

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

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

不是C字符串,因为数组不是以null结尾。违反转换speicier的要求会调用未定义的行为,这就是您获得此意外结果的原因。

答案 4 :(得分:0)

您尝试使用printf将字符串数组打印为字符串。试试这段代码:

int pointer=0;
while(pointer < 4){
     printf("%c",name1[pointer]);
     pointer++;
}