我的问题是,当我为go变量分配内存时,如下面的代码所示,我可以到达我没有分配的区域(在本例中是在第一个之后)。那么,这个最高到达点的极限是什么,因为当我试图打印或访问千分之一的位置时,我会得到一个分割错误。操作系统(Ubuntu18.04)如何限制这个区域?
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
int *go=NULL;
go = malloc(sizeof(int)*1);
*go = 190;
*(go+1)=20;
*(go+2)=-13;
*(go+3)=450;
*(go+4)=140;
*(go+5)=190;
printf("%d\n",*(go));
printf("%d\n",*(go+1));
printf("%d\n",*(go+2));
printf("%d\n",*(go+3));
printf("%d\n",*(go+4));
printf(">>>%d\n",*(go+5));
return 0;
}发布于 2019-05-26 18:26:50
地址空间由操作系统的应用程序分配。这些分配有一个粒度,这是一个功能的硬件,操作系统和参数的malloc库。很少有体系结构具有过去的粒度。
Malloc并不是一个典型的操作系统接口,而是建立在不那么复杂的机制之上的一个高度可用的库。Malloc决定它希望通过什么粒度来增长和缩小地址空间,并构造数据结构来跟踪内存的大小,这样就方便了。例如,它可能永远不会返回小于64字节的对象。您可能可以使用realloc:分配一组小对象(例如1字节)来确定这一点,并找到最接近的两个地址,然后使用较低的指针和这种差异调用grow()。可能你有一种非常规的麦高乐,这是行不通的.
int grow(void *p, int maxdiff) {
int i;
for (i = 2; i < maxdiff; i++) {
void *t = realloc(p, i);
if (t != p) {
return i;
}
}
return -1;
}要获得有关malloc()的良好教程,请阅读并理解K&R的“C编程语言”中的实现。
https://stackoverflow.com/questions/56314331
复制相似问题