【发布时间】:2014-04-10 17:06:39
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int noOfIntegers = 2;
struct stack {
int *s;
int top;
} st;
void push(int item) {
st.top++;
st.s[top] = item;
}
int main() {
st.s = malloc (2 * (sizeof(int)));
st.top = -1;
push(1);
push(2);
push(3);
return 0;
}
我不明白为什么这没有给出分段错误,因为我有 2 个 int 的 malloc 空间,并且正在将 3 插入到指针指向的数组中。
【问题讨论】:
-
这是未定义行为的美妙之处(在您的情况下访问越界元素)。如果你不走运,它可能会按预期工作;如果你幸运的话,它会大声爆炸。
-
破坏堆比创建 SEGFALT 的可能性更大。如果您在小型内存实现上尝试过它,例如 8051,其中每个字节都经过精心管理,它可能会这样做。但在大多数 32 位以上的地址空间中,分配单元通常以 16 字节(或更大)的单元进行管理,因此超出您要求的几个字节不会造成任何问题。
-
您认为是什么导致了分段错误?由于您的信念导致您错误地得出您的程序必须产生这样的错误的结论,因此您的信念不正确的可能性很大。因此,一个更好的问题可能是“导致分段错误的原因是什么?”我注意到这个问题可以通过阅读相关的维基百科页面来回答。