#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号,从右端开始,哦,哦,这次你进入雷区.
你的车为什么爆炸?因为你在雷区.
现在很明显为什么写入你不拥有的内存并不能保证分段错误?分段错误意味着"你在一个甚至不是有效页面的内存页面 ".如果您使用的是您不应该使用的有效页面的一部分,操作系统就不会知道这一点.