连续内存块的动态分配(malloc)

时间:2010-02-12 00:07:14

标签: c pointers malloc

对于一个赋值,我必须为一个结构分配一个连续的内存块,但我首先尝试使用一个二维的int数组,然后看看我是否正确理解它。我们在书中有一个例子,它为指针数组(行)创建一个内存块,然后初始化cols并将指针指向它们。这个例子是:

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);
}

我基本上需要做上面代码所做的事情,除了使它成为一个连续的内存块。约束是我只允许调用malloc一次,然后我必须使用指针数学来知道初始化指针的内容。所以我想我会用以下内容初始化足够的内存:

int *createInt2D(size_t rows, size_t cols) 
{
    malloc(rows * sizeof(int *) + (row + cols) * sizeof(int));
}

但这似乎不太正确,因为我认为我必须对从malloc返回的void *进行类型转换,但它是int和int *的组合。所以我不太确定我是否走在正确的轨道上。思考?

4 个答案:

答案 0 :(得分:2)

如果你想要一个连续的数组,你应该malloc(rows * cols * sizeof(int))

然后你可以访问arr[x, y],如:

arr[x * cols + y]

答案 1 :(得分:1)

你走在正确的轨道上。 malloc返回的块保证正确地对齐int *或int;你也可以用它。类型转换不是一次性操作。

如果您要独占使用array[row, col]寻址,则可以在不为行指针分配额外空间的情况下使用。如果您希望能够使用array[row]获取int *列列表,则必须在分配中为列指针添加空间。

希望这足以帮助你锻炼身体。

答案 2 :(得分:1)

malloc((row * cols) * sizeof(int));

它是行* cols,它是2D数组中的元素数,而不是row + cols。

答案 3 :(得分:0)

无需乘以int *的大小。那只用于分配行的指针。行和列的总和也是如此。分配(rows * cols)* sizeof足以分配任何结构就足够了。