我对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
答案 0 :(得分:0)
gets()
会将一个空字符写入数组。您似乎已经知道gets()
是危险的,应该避免,我添加了这个以防万一。
答案 1 :(得分:0)
好的,其他人用高级语言和老年人的表达来解释它。
我想在汇编图层中解释你的情况。
你知道为什么你的第一种情况毫无意外地发生了吗?
因为缓冲区溢出不会破坏其他进程的内存,所以操作系统不会向您的进程发出Segmentation错误信号。
为什么你的堆栈长度超过数组的大小?
由于对齐。许多操作系统需要一个堆栈帧来对齐x个字节以实现有效的寻址。
x取决于机器。
例如,如果x是16个字节。
char s[1] will lead the stack to 16 byte;
char s[17] will lead the stack to 32byte.