<分区>
返回执行后我得到Segmentation fault
。为什么它在 return 之后出现,而不是在 strcpy 中?
int main()
{
char a[2];
strcpy(a,"0123456789101112131415161718192021222324252627282930");
printf("%s\n",a);
return 0;
}
标签 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 strncpy 或 an 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/