c语言 - 访问 超越 malloc()'d 内存



我的问题是,当我为变量分配内存时,如以下代码中,我可以到达我不分配的区域(在这种情况下,在第一个之后(。因此,此顶部到达点的限制是什么,因为当我尝试打印或访问千分位置时,我会遇到分段错误。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编程语言"的实现。

相关内容

  • 没有找到相关文章

最新更新