【发布时间】:2011-10-26 17:29:41
【问题描述】:
在像 linux 这样的按需分页系统中,我读到的页面可能约为 4k,它通过检查堆栈或堆大小是否超过给每个页面的数量来确保保护。当我创建两个变量时
char *s = (char *) malloc(100);
char sa[100];
在 for 循环中,我可以写 s[i] = 'c'; 几乎 4000 次,然后才出现内存错误
而使用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);
}
【问题讨论】:
-
从语言上看,这两种情况都是完全未定义的。为实现特定的问题添加了
gcc标签。 -
仅供参考,绝不保证您只能使用堆栈分配的变量写入数组的长度。我在我的 x86_64 机器上达到了 2880(它在
&sa[i] == 0x7ffffffff000上打开了一个新页面)。 -
我认为我们应该忽略为什么要写入分配范围之外的数组的问题,对吧?
-
所以我阅读了有关 gcc 和金丝雀(或保护字节... gcc 是否在每次堆栈增长时检查保护字节覆盖?。
-
@christian-semrau 是的...
标签: c gcc memory heap-memory stack-memory