我的问题是,当我为go变量分配内存时,如下面的代码所示,我可以到达未分配的区域(在这种情况下,是第一个之后的区域)。那么这个最高到达点的极限是多少,因为当我尝试打印或访问千位时,会遇到细分错误。 OS(Ubuntu 18.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;
}
答案 0 :(得分:3)
地址空间由应用程序从OS分配。这些分配的粒度取决于硬件,操作系统和malloc库的参数。很少有体系结构具有按字节划分的粒度。
Malloc通常不是操作系统接口,而是基于不太复杂的机制构建的高度可用的库。 Malloc确定要增加和缩小地址空间所需的粒度,并构造数据结构以方便的大小跟踪内存。例如,它可能永远不会返回少于64个字节的对象。您可以使用realloc来确定它们:分配一组小对象(例如1个字节),找到最靠近的两个地址,然后使用下方的指针和这种差异。可能您有一个非常规的malloc,但这无法正常工作。...
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编程语言”中的实现。