浏览 1942 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-26
最后修改:2009-12-27
linux与windows的地址越界保护有很大的不同。 例如一个录入矩阵的C程序: #include<stdio.h> #include<stdlib.h> int main() { int **array,a,b,i,j; scanf("%d",&a); while(a!=-1){ scanf("%d",&b); array=(int **)malloc(sizeof(int *)*a); for(i=0;i<a;i++){ *(array+i) = (int*)malloc(sizeof(int)*b); for(j=0;j<b;j++){ scanf("%d",(*(array+i)+j+1000));//!!! printf("%d ",*(*(array+i)+j+1000));//!!! } printf("\n"); } scanf("%d",&a); } } 接受输入: 2 3 //矩阵大小 2X3 1 2 3 4 5 6 输出: 1 2 3 4 5 6 重点在于程序中的叹号注释处,我给地址加了1000的偏移量。 在windows下写了很久代码了,这种情况肯定是越界了,但是linux下却没有问题,运行的很好。当然,并不是linux没有断错误之类的越界概念,只是在程序的私有地址空间等方便的概念上,可能与win是不同的。 现在的问题是: 我在做一个web的编译器,并且可以用来运行用户提交的程序,然而如果这样的win型错误可以在linux下运行正确的话,程序的行为就不一致了。 后记: 我想,这可能是和内存的管理有关系。Linux应该是基于段页式的内存管理方案,按照一般操作系统知识来说,4KB每页是比较常见的吧。所以,一个这样的c程序,可能只分配到1个页,根据内存的映射原理来说,位于这个页内的地址都会是程序的合法地址,事实上,也许程序根本用不了4Kb这么大的空间~ 所以,没有发生越界,看来是很合理的解释。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-26
最后修改:2009-12-26
这么小的chunk都是在prealloc里的,很难有保护的。
windows应该也是。只不过运气好吧。 PS这和编译器提供的crt也有关系 |
|
返回顶楼 | |