在c中初始化双指针的正确方法是什么

What is the right way to initialize double pointer in c

如题,我想知道如何用sizeof指针初始化双指针

例如

int **p=malloc(sizeof *p * rows);

for(size_t i = 0; i < rows; i++){
    p[i]=malloc(sizeof ? * cols);
}

我应该填写什么?

如有任何帮助,我们将不胜感激。

看来你希望p是一个可以容纳指针的数组,指针的个数是rows。所以你可以像这样为 p 分配内存:

int ** p = malloc(sizeof(int *) * rows);

现在,如果您希望 p[i] 指向包含 cols 个整数的数组,请执行以下操作:

p[i] = malloc(sizeof(int) * cols);

What should I fill in ?.

一般来说当你有

X = malloc(sizeof ? * NUMBER);

? 将替换为 X 指向的类型。那可以简单地写成 *X.

所以行:

p[i]=malloc(sizeof ? * cols);

是:

p[i]=malloc(sizeof *p[i] * cols);

请注意,二维数组的创建要简单得多。您只需要

int (*p)[cols] = malloc(sizeof *p * rows);

这里p是指向colsint数组的指针。因此 sizeof *p 将是 cols int.

数组的大小

使用这种基于 VLA 的技术意味着您可以使用单个 malloc 分配二维数组。除了使代码更简单(即只有 1 malloc)之外,它还确保整个 2D 数组在连续内存中,这可能会给你更好的缓存性能。