我有以下代码
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int age;
} data;
int storage (data **str) {
*str = malloc(4 * sizeof(**str));
(*str)[0].age = 12;
return 0;
}
int main() {
data *variable = NULL;
storage(&variable);
return 0;
}
我从网站资源中获取的。我想我对指针概念的基本指针存在误解,因为在此代码中,我们有一个指向结构的指针,变量
,我们将其传递给存储
函数,它需要指向结构类型指针的指针。分配内存后,我不明白这个赋值
(*str)[0].age = 12
它的赋值就好像 str
是 (*)[]
类型一样。我不明白这个赋值是如何工作的,比如 str
现在是一个指向结构数组的指针?
最佳答案
首先,关于取消引用指针的 C 语法的注意事项:
a[b]
等价于*(a + b)
,等价于*(b + a)
,等价到 b[a]
。
现在,在
int main() {
data *variable = NULL;
storage(&variable);
return 0;
}
variable
是“指向 data
的指针”类型,因此它的地址 &variable
是“指向 data 指针的指针”类型
”。这被传递给 int storage(data **str)
,并且是参数 str
的正确类型。
int storage (data **str) {
*str = malloc(4 * sizeof(**str));
(*str)[0].age = 12;
return 0;
}
在这里,str
被取消引用,产生一个 data *
类型的左值,指定与 main()
的 variable 相同的对象
。由于它是左值,因此可以分配给它。
malloc()
分配没有声明类型的内存,足够大(并且充分对齐)以包含类型为 data
的四个连续对象。它返回一个指向分配开始的指针。
(*str)[0]
现在是一个左值,指定类型为 data
的对象,并通过访问内存 malloc()
通过此表达式分配,内存的有效类型变为数据
。 (*str)[0].age = 12;
将值 12
分配给此对象的 age
- 成员,留下其他成员未初始化的结构(以及分配的内存的其余部分)。
关于c - 指向结构指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36145343/