的使用malloc内存连续块 [英] Contiguous block of memory with malloc

查看:108
本文介绍了的使用malloc内存连续块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在一个函数调用具有存储器作为指针阵列到另一个块的第一部分来创建一个连续的内存块。基本上,我试图做的:

  INT ** CreateInt2D(为size_t行,为size_t COLS)
{
    INT ** P,** P1,**结束;
    P =(INT **)SAFEMALLOC(行*的sizeof(INT *));
    COLS * = sizeof的(INT);
    为(端= P +的行,P1 = P; P1&所述末端++ p1)为
        * P1 =(INT *)SAFEMALLOC(COLS);
    返回(P);
}无效* SAFEMALLOC(为size_t大小)
{
    void *的副总裁;    如果((VP =的malloc(大小))== NULL){
        的fputs(出纪念品的标准错误);
        出口(EXIT_FAILURE);
    }
    返回(VP);
}

但随着一个街区。这是据我已经得到了:

 为int * Create2D(为size_t行,为size_t COLS){
 INT ** memBlock;
 INT ** arrayPtr;
 INT loopCount;
    memBlock =(INT **)的malloc(行*的sizeof(INT *)+ *行* COLS的sizeof(INT));
    如果(arrayPtr == NULL){
        的printf(无法分配空间,退出...);
        出口(EXIT_FAILURE);
    }
    为(loopCount = 1; loopCount&下; =(int)的行; loopCount ++){
        arrayPtr = memBlock +(loopCount * sizeof的为(int *));
        //我不认为这部分是正确的。我需要像arrayPtr [loopCount] = ....
    }
 回报(memBlock);
}


解决方案

像这样

  INT ** Create2D(为size_t行,为size_t COLS)
 {
    为size_t CB =(行*的sizeof(INT *))+(行* COLS *的sizeof(INT));
    为int * PMEM =(INT *)SAFEMALLOC(CB);    INT ** PROWS =(INT **)PMEM;
    为int * PCOL =(INT *)及PROWS [行]最后行指针后//点PCOL    为(中间体二= 0; II蛋白酶行++ⅱ)
    {
       PROWS [Ⅱ] = PCOL;
       PCOL + = COLS;
    }    返回PROWS;
}

I'm trying to create a contiguous block of memory in one function call that has the first part of the memory as pointer arrays to the other blocks. Basically, I'm trying to do:

int **CreateInt2D(size_t rows, size_t cols)
{
    int **p, **p1, **end;
    p = (int **)SafeMalloc(rows * sizeof(int *));
    cols *= sizeof(int);
    for (end = p + rows, p1 = p; p1 < end; ++p1)
        *p1 = (int *)SafeMalloc(cols);
    return(p);
}

void *SafeMalloc(size_t size)
{
    void *vp;

    if ((vp = malloc(size)) == NULL) {
        fputs("Out of mem", stderr);
        exit(EXIT_FAILURE);
    }
    return(vp);
}

But with one block. This is as far as I've gotten:

int *Create2D(size_t rows, size_t cols) {
 int **memBlock;
 int **arrayPtr;
 int loopCount;
    memBlock = (int **)malloc(rows * sizeof(int *) + rows * cols * sizeof(int));
    if (arrayPtr == NULL) {
        printf("Failed to allocate space, exiting..."); 
        exit(EXIT_FAILURE);
    }
    for (loopCount = 1; loopCount <= (int)rows; loopCount++) {
        arrayPtr = memBlock + (loopCount * sizeof(int *));
        //I don't think this part is right.  do I need something like arrayPtr[loopCount] = ....
    }
 return(memBlock);
}

解决方案

Something like this

 int **Create2D(size_t rows, size_t cols) 
 {
    size_t cb = (rows * sizeof(int *)) + (rows * cols * sizeof(int));
    int * pmem = (int *)SafeMalloc(cb);

    int ** prows = (int **)pmem; 
    int * pcol = (int *)&prows[rows]; // point pcol after the last row pointer

    for (int ii = 0; ii < rows; ++ii)
    {
       prows[ii] = pcol;
       pcol += cols;
    }

    return prows;
}

这篇关于的使用malloc内存连续块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆