c - 返回后出现段错误?

标签 c

<分区>

返回执行后我得到Segmentation fault。为什么它在 return 之后出现,而不是在 strcpy 中?

int main()
{

     char a[2];

     strcpy(a,"0123456789101112131415161718192021222324252627282930");
     printf("%s\n",a);

     return 0;

}

最佳答案

I am getting Segmentation fault after return executes. Why is it coming after return and not in strcpy?

您犯了一个名为 a buffer overflow 的常见错误。这会导致未定义的行为,这是标准答案。但是,如果您了解典型机器如何使用 a stack ,您就会理解为什么它在您返回时会崩溃。大多数 CPU 使用向下增长的堆栈。所以在你调用 strcpy 之前,堆栈是这样的,

sp + 0 : a[0]
sp + 1 : a[1]
sp + 2 : padding
sp + 3 : padding
sp + 4: return address (four bytes)

每次您使用“C”中的函数时,编译器都会创建一个 call frame。返回地址作为 堆栈 的一部分存在,编译器在其中为您的 a[] 数组分配空间。由于它对于字符串副本来说太小了,所以你覆盖了返回地址。在您返回之前不会使用此值。返回地址将被类似值 0x34353637 的内容覆盖,它是 ASCII 文本“4567”的二进制指针。

建议使用 something like strncpyan alternative 。例如,

strncpy(a,"012345678...", sizeof(a));
a[sizeof(a)-1] = 0;   /* ensure the string is terminated. */

显然,如果要打印完整字符串,则需要增加“a”数组的大小。

关于c - 返回后出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432949/

相关文章:

c - 编辑此汇编代码以仅使用加/减/移位

c - 线程安全位数组?

c - M95128-W EEPROM。每页的第一个字节未正确写入或读取

c - c中有P2P框架吗?

mysql - 在 C 中使用 select 子查询子句执行更新语句

c - 移动数组的列

c - 从不同位置读取文件并放入 C 中的数组

c - 调用fork时是否复制线程?

c - 如何在gtk中捕获事件框上的事件来检测鼠标移动?

c - 按间隔汉明码