我的问题是,当我为变量分配内存时,如以下代码中,我可以到达我不分配的区域(在这种情况下,在第一个之后(。因此,此顶部到达点的限制是什么,因为当我尝试打印或访问千分位置时,我会遇到分段错误。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("%dn",*(go));
printf("%dn",*(go+1));
printf("%dn",*(go+2));
printf("%dn",*(go+3));
printf("%dn",*(go+4));
printf(">>>%dn",*(go+5));
return 0;
}
地址空间由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&amp; r的" C编程语言"的实现。