在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
是一个指向cols
int
数组的指针。因此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)
,其中 x
是 int
类型的某个变量。
我明白了。非常感谢。以上是关于在c中初始化双指针的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章