我无法理解此代码输出的异常行为。 它打印:
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;
}
答案 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++;
}