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

Posted

技术标签:

【中文标题】在c中初始化双指针的正确方法是啥【英文标题】:What is the right way to initialize double pointer in c在c中初始化双指针的正确方法是什么 【发布时间】:2022-01-21 18:13:23 【问题描述】:

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

例如

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

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

?应该填写什么。

任何帮助将不胜感激。

【问题讨论】:

sizeof **p 会起作用,sizeof *p[0]sizeof *p[i]sizeof p[i][0] 也会起作用。所有这些都是一样的,所以选择对你最清楚(在威胁中)的那个 一般来说,除非您有特殊要求,否则您永远不应该编写这样的代码。要分配一个二维数组,只需执行int (*arr)[cols] = malloc( sizeof(int[rows][cols]) );。没有循环。除非你现在真的需要每个都有单独的尺寸或类似的特殊要求。 详情请见Correctly allocating multi-dimensional arrays。 要分配一个指向“2D”数组的指针,代码可以使用简单的int (*p)[row][cols] = malloc(sizeof *p);,但是访问看起来像(*p)[r][c] 【参考方案1】:

我应该填写什么?

一般情况下

X = malloc(sizeof ? * NUMBER);

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

所以行:

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

将是:

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

请注意,可以更简单地创建 2D 数组。你只需要

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

这里的p是一个指向colsint数组的指针。因此sizeof *p 将是cols int 数组的大小。

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

【讨论】:

这应该是公认的答案,如果所有元素的 col 长度相同,则应该创建一个 VLA 数组指针,而不是只获得 1 次 malloc 调用。 请注意,int (*p)[cols] 不再是 OP“双指针”,但仍然是一个值得考虑的好主意。【参考方案2】:

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

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

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

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

【讨论】:

感谢您的回答,这真的很有帮助。但我想用sizeof 初始化一个指针(只是好奇)。 什么意思?您的二级分配是针对 ints 的数组,而不是指针,因此最好使用 sizeof(int) 或使用 sizeof(x),其中 xint 类型的某个变量。 我明白了。非常感谢。

以上是关于在c中初始化双指针的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

类成员的正确语法函数指针列表是啥?

C函数中双指针和单指针有啥区别

C语言中,字符与字符串的区别是啥?(详细点)

包含双指针的单链表的正确名称是啥?

将数组中的所有元素初始化为 NaN 的最快方法是啥?

如何从 C# 将双指针传递给 COM 并在 COM 中初始化它