【问题标题】:Dynamic allocation (malloc) of contiguous block of memory连续内存块的动态分配(malloc)
【发布时间】:2011-01-15 23:09:27
【问题描述】:

对于一个分配,我必须为一个结构分配一个连续的内存块,但我首先尝试使用一个二维整数数组来做它,看看我是否理解正确。我们在书中有一个示例,它为指针数组(行)创建一块内存,然后初始化 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* 的组合。所以我不太确定我是否走在正确的轨道上。想法?

【问题讨论】:

    标签: c pointers malloc


    【解决方案1】:
    malloc((row * cols) * sizeof(int));
    

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

    【讨论】:

      【解决方案2】:

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

      如果您打算只使用array[row, col] 寻址,则无需为行指针分配额外空间即可。如果您希望能够使用array[row] 获得int * 列列表,则必须在分配中为列指针包含空间。

      希望这足以帮助您锻炼。

      【讨论】:

      • 但是我如何将该内存块分成列,以及指向这些列的数组。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        arr[x * cols + y]
        

        【讨论】:

          猜你喜欢
          • 2010-10-12
          • 2022-11-10
          • 1970-01-01
          • 2020-11-23
          • 2014-02-15
          • 2014-09-29
          • 2012-11-12
          • 2013-11-20
          相关资源
          最近更新 更多