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

连续内存块的动态分配(malloc),c,pointers,malloc,C,Pointers,Malloc,对于赋值,我必须为一个结构分配一个连续的内存块,但我首先尝试使用一个int的2D数组,看看我是否正确理解它。我们在书中有一个例子,为指针数组行创建一个内存块,然后初始化col并将指针指向它们。这个例子是: int **CreateInt2D(size_t rows, size_t cols) { int **p, **p1, **end; p = (int **)SafeMalloc(rows * sizeof(int *)); cols *= sizeof(int);

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

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返回的void*进行类型转换,但它是int和int*的组合。所以我不太确定我是否走上了正确的道路。想法

如果需要一个连续数组,应该使用mallocrows*cols*sizeofint

然后您将访问arr[x,y],如:


如果需要一个连续数组,那么应该使用mallocrows*cols*sizeofint

然后您将访问arr[x,y],如:


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

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

您的思路是正确的。malloc返回的块保证为int*或int正确对齐;你可以用它来做任何事。类型转换不是一次性操作

如果要专门使用array[row,col]寻址,则无需为行指针分配额外的空间。如果您希望能够使用array[row]获取int*列列表,则必须在分配中包含列指针的空间


希望这对你的锻炼有足够的帮助。

你走上了正确的轨道。malloc返回的块保证为int*或int正确对齐;你可以用它来做任何事。类型转换不是一次性操作

malloc((row * cols) * sizeof(int));
如果要专门使用array[row,col]寻址,则无需为行指针分配额外的空间。如果您希望能够使用array[row]获取int*列列表,则必须在分配中包含列指针的空间

希望这对你的锻炼有帮助

malloc((row * cols) * sizeof(int));
它是row*cols,是二维数组中的元素数,而不是row+cols


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

但是我如何将内存块划分为列,以及指向这些列的数组。但是,我如何将内存块划分为列,以及指向这些列的数组。
malloc((row * cols) * sizeof(int));