gpt4 book ai didi

c - 访问超出 malloc() 的内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:13 26 4
gpt4 key购买 nike

我的问题是,当我像下面的代码一样为 go 变量分配内存时,我可以到达我没有分配的区域(在本例中是在第一个区域之后)。那么这个最高点的限制是什么,因为当我尝试打印或访问第 1000 个位置时,我遇到了段错误。 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;
}

最佳答案

地址空间由应用程序从操作系统分配。这些分配的粒度是硬件、操作系统和 malloc 库参数的函数。很少有架构具有字节粒度。

Malloc 通常不是一个操作系统界面,而是一个建立在不太复杂机制之上的高度可用的库。 Malloc 确定它希望将地址空间增长和缩小的粒度,并构建数据结构以在方便的大小下跟踪内存。例如,它可能永远不会返回小于 64 字节的对象。您也许能够使用 realloc 来确定这一点:分配一组小对象(比如 1 个字节),并找到最接近的两个地址,然后使用较低的指针调用下面的 grow() 和这个区别。可能您有一个非常规的 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 的“The C Programming Language”中的实现。

关于c - 访问超出 malloc() 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56314331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com