C中的字符数组(Puts vs printf)

时间:2013-10-20 02:53:44

标签: c printf character-arrays puts

我对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

2 个答案:

答案 0 :(得分:0)

  1. 实际上,即使只写一个字符,它仍然是缓冲区溢出,因为gets()会将一个空字符写入数组。
  2. 缓冲区溢出并不一定意味着分段错误。您不能以任何方式依赖未定义的行为。可能它只是花了几次程序来打破它不应该写的内存。
  3. 您似乎已经知道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.