为什么这不会给出分段违规错误?

Aks*_*hah 2 c arrays malloc

#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;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不会给出分段错误,因为我有2个malloc空间int,并且在指针所指向的数组中插入3.

Eri*_*ert 14

更新:这个问题是我2014年5月ATBG专栏的灵感来源.谢谢你这个好问题!


想象一下巨大的雷区,延伸到地平线.如果你开过矿井,BOOM,你的车就会爆炸.

在雷区中间是未开采的停车场,每个都有四千个编号的空间.每个停车场都有一个号码.每个空间都有一个数字.有些地方彼此相邻,有些则没有.

你打电话给停车场经理并请求八个空格.你被告知你的空间是100,空间1234到1241.

你开车去了很多地方,在1243号空间找到一辆车,把车停在那个地方,然后带着别人的车开走.

为什么你的车爆炸了?因为你不在雷区.你有没有违反规定?当然.你偷了别人的停车位.不要那样做.他们可能会因为没找到他们的车而生气.但他们不会打击你.

然后你驾驶那辆车去4003,但是这个地方只有4000个点,所以你开车去4000点,然后从停车场的右边开车到位于4000点右边三个点的地方.原来是停车场101的第3号现场.你将偷来的车停在那里并偷走以前在那个地方的车.

为什么你的车爆炸了?因为你不在雷区.

然后你开车到100号地点8003,它只有4000个点,一直穿过100号,一直到101号,从右端开始,哦,哦,这次你进入雷区.

你的车为什么爆炸?因为你在雷区.

现在很明显为什么写入你不拥有的内存并不能保证分段错误?分段错误意味着"你在一个甚至不是有效页面的内存页面 ".如果您使用的是您不应该使用的有效页面的一部分,操作系统就不会知道这一点.