访问超出malloc()的内存

时间:2019-05-26 14:19:40

标签: c memory-management malloc

我的问题是,当我为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;
}

1 个答案:

答案 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编程语言”中的实现。