c - 指向结构指针的指针

标签 c arrays pointers struct

我有以下代码

#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/

相关文章:

arrays - JSON文件以数组开头怎么办?

c++ - 比较 STL 堆中 std::shared_ptr 的值和 std::find。 (尝试实现 A*)

c++ - libpng png_set_add_alpha | png_set_filler 错误 : sequential row overflow

c - Linux 中重写 malloc、free 和 calloc 会导致递归

c - 未知类型名称 'sll'。结构问题

c - 动态分配和Matrix.Help me

c - 使用 memcpy 复制作为参数传递的数组

c - 在迷你 shell 中使用管道系统调用

c++ - 创建一个结构数组但稍后定义大小?

php - 在 PHP 中,过滤关联数组的数组