【发布时间】:2013-10-20 02:53:43
【问题描述】:
我对 C 中的字符数组有一些疑问,我有一个大小为 1 的字符数组,逻辑上说当我输入超过 2 个字符时,我应该遇到分段错误,但是 puts 正确打印出数组而printf 打印数组的某些部分以及垃圾值,为什么会发生这种情况
#include<stdio.h>
int main()
{
int i;
char A[1];
printf("%d\n",(int)sizeof(A));
gets(A);
puts(A);
for(i=0;i<8;i++)
{
printf("%c\n",A[i]);
}
}
O/P:
1
abcdefg
abcdefg
a
f
g
为此,我必须在程序中输入多个array size 字符以引发分段错误。是因为堆栈中的 SFP 吗? SFP的大小是4个字节,如有错误请指正
1
abcdefghijklmnop
abcdefghijklmnop
a
f
g
h
Segmentation fault
【问题讨论】:
-
写入无效内存会产生未定义的行为......这意味着结果不一定直观也不一致。有些事情似乎有效或部分有效——但如果你依赖它,通常不会;)
-
我明白,但是
puts似乎每次在上述程序中都能始终如一地工作。 -
“似乎始终如一地工作”和“始终如一地工作”之间存在巨大差距。当仅在当前程序的范围内查看它时,它很可能会一直持续工作——无论是细微的变化(移动变量定义、将代码从堆栈上的一个例程移动到另一个例程、更改为新的编译器、使用不同的编译器进行编译) flags) 有可能破坏事物。
标签: c printf character-arrays puts