首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问malloc()d内存之外的

访问malloc()d内存之外的
EN

Stack Overflow用户
提问于 2019-05-26 14:19:39
回答 1查看 91关注 0票数 0

我的问题是,当我为go变量分配内存时,如下面的代码所示,我可以到达我没有分配的区域(在本例中是在第一个之后)。那么,这个最高到达点的极限是什么,因为当我试图打印或访问千分之一的位置时,我会得到一个分割错误。操作系统(Ubuntu18.04)如何限制这个区域?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-26 18:26:50

地址空间由操作系统的应用程序分配。这些分配有一个粒度,这是一个功能的硬件,操作系统和参数的malloc库。很少有体系结构具有过去的粒度。

Malloc并不是一个典型的操作系统接口,而是建立在不那么复杂的机制之上的一个高度可用的库。Malloc决定它希望通过什么粒度来增长和缩小地址空间,并构造数据结构来跟踪内存的大小,这样就方便了。例如,它可能永远不会返回小于64字节的对象。您可能可以使用realloc:分配一组小对象(例如1字节)来确定这一点,并找到最接近的两个地址,然后使用较低的指针和这种差异调用grow()。可能你有一种非常规的麦高乐,这是行不通的.

代码语言:javascript
复制
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编程语言”中的实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56314331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档