0

我对 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]);
}
}

输出/输出:

1
abcdefg
abcdefg
a




f
g

除此之外,我必须在array size程序中输入多个字符以引发分段错误。是因为堆栈中的 SFP 吗?SFP的大小是4个字节如果我错了请纠正我

1
abcdefghijklmnop
abcdefghijklmnop
a




f
g
h
Segmentation fault
4

2 回答 2

0

好的,其他人用高级语言和长辈的经验解释。

我想解释一下你在装配层的情况。

你知道为什么你的第一个情况没有发生意外吗?

因为您的缓冲区溢出不会破坏其他进程的内存,所以操作系统不会向您的进程发出分段错误信号。

为什么你的堆栈长度大于数组的大小?

因为对齐。许多操作系统需要一个对齐 x 字节的堆栈帧来实现有效的寻址。

x 取决于机器。

例如,如果 x 是 16 个字节。

char s[1] will lead the stack to 16 byte; 
char s[17] will lead the stack to 32byte.
于 2013-10-20T06:28:24.933 回答
0
  1. 实际上即使你只写一个字符,它仍然是缓冲区溢出,因为gets()会向数组写入一个空字符。
  2. 缓冲区溢出不一定意味着分段错误。您不能以任何方式依赖未定义的行为。可能程序只需要几次来破坏它不应该写入的内存。

看来您已经知道这gets()是危险的,应该避免,我添加了这个以防万一。

于 2013-10-20T03:01:03.720 回答