在像Linux这样的需求分页系统中,页面大小可能为4k(根据我所看到的)。为了确保保护,它会检查堆栈或堆大小是否超过每个给定页面的数量。当我创建两个变量时,这种保护机制被启用。
在for循环中,我可以写大约4000次
编辑:我在下面发布整个代码。
char *s = (char *) malloc(100);
char sa[100];
在for循环中,我可以写大约4000次
s[i] = 'c';
,然后它就会出现内存错误,而对于sa[i] = 'c';
,在数组大小之外的任何地方都会出现segmentation fault
或stack smashing
错误。我可以理解第一种情况下会出现页错误,并且它会发现没有更多的页面被分配到堆中,因此会发生内存违规。但是第二种情况会发生什么呢?gcc是否在运行时为所有预分配变量进行检查?编辑:我在下面发布整个代码。
int main(int argc,char* argv[]){
char *s = (char *) malloc(20);
char sa[400] = {0};
int i ,count;
printf(" enter the number of chars to write: ");
scanf("%d",&count);
for (i=0;i<count;i++){
printf("%d\n",i);
sa[i] = 'a';
//s[i] = 'a';
}
free(s);
}
&sa[i] == 0x7ffffffff000
,达到了新的页面)。 - user786653