【发布时间】:2011-04-19 15:18:16
【问题描述】:
谁能解释一下这个现象。
#include "stdio.h"
#include "stdlib.h"
int main()
{
char foo[]="foo";
char bar[3]="bar";
printf("%s",foo);
printf("\n");
printf("%s",bar);
return 0;
}
结果:
foo
barfoo
如果我在 foo 之前更改顺序并创建 bar,我会得到正确的输出。
#include "stdio.h"
#include "stdlib.h"
int main()
{
char bar[3]="bar";
char foo[]="foo";
printf("%s",foo);
printf("\n");
printf("%s",bar);
return 0;
}
结果:
foo
bar
还有一个。
#include "stdio.h"
#include "stdlib.h"
int main()
{
char foobar[]="foobar";
char FOO[3]={'F','O','O','\0'};
char BAR[3]="BAR";
printf("%s",foobar);
printf("\n");
printf("%s",FOO);
printf("\n");
printf("%s",BAR);
return 0;
}
结果:
foobar
FOOfoobar
BARFOOfoobar
【问题讨论】:
-
不应该有关于您尝试用 4 字节数据填充 3 字节缓冲区的警告吗?
-
系统标头(不是必需的文件)由
<stdio.h>标识。头文件由"my_header.h"标识(如果引号处理失败,则重新处理为<my_header.h>)。 -
@MarkusG-:您的第三个示例是不可编译的。
FOO的声明是非法的,任何符合标准的 C 编译器都会立即拒绝。如果您的编译器在没有诊断消息的情况下接受它,则说明您的编译器已损坏。 -
@Timbo 我没有收到任何警告。 (使用 Code::Blocks 10.05)
-
这不是“奇怪”,也不是“现象”。阅读 C 书籍中关于字符串的章节。