c - 如何通过包含指向结构体指针的数组元素来访问和修改结构体内部声明的指针类型变量?

标签 c pointers struct

我声明了一个结构类型的双指针,并使用calloc为其分配了所需的内存。然后我分配了数据成员(指针)所需的空间,但它给出了段错误错误。所以只打印了done1。我们不能访问这样的结构中的数据成员指针吗?

我什至将 q[0] 替换为 *q 但它不起作用。

#include<stdio.h>
#include<stdlib.h>

struct one
{
    int *a;
};

int main()
{
    struct one **q;
    q = (struct one**) calloc(sizeof(struct one*),10);
    printf("done1\n");
    q[0]->a = (int*) malloc(sizeof(int));
    printf("done2\n");
    *(q[0]->a) = 10;
    printf("done3 , q[0]->a stores %d value\n",*(q[0]->a));
    return 0;
}

预期结果是打印所有“完成”,但仅打印第一个完成。

最佳答案

你做了calloc这样您就可以创建一个指针数组,即 {q[0], q[1], .., q[9]} 。但是,每个单独的元素本身都是一个指针,因为您正在执行 calloc ,它们可能被初始化为 NULL 。但是,那么您将直接尝试访问 q[0]->aq[0]仍然是指向 NULL 的指针.

如果您附加一个调试器并查看它崩溃的位置,则可能是 q[0]->a = ...

首先,您必须将内存分配给 q[0]然后访问q[0]->a .

#include <stdio.h>
#include <stdlib.h>

struct one
{
    int *a;
};

int main()
{
    struct one **q;
    q = (struct one**) calloc(sizeof(struct one*), 10);
    printf("done1\n");
    q[0] = (struct one*) calloc(sizeof(struct one), 1);
    q[0]->a = (int*) malloc(sizeof(int));
    printf("done2\n");
    *(q[0]->a) = 10;
    printf("done3 , q[0]->a stores %d value\n", *(q[0]->a));
    return 0;
}

顺便说一句,你的代码没有在我的编译器上编译,显示 unknown type one** 。所以我把它改成了struct one无处不在。

关于c - 如何通过包含指向结构体指针的数组元素来访问和修改结构体内部声明的指针类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399366/

相关文章:

CreateFile 总是覆盖指定的文件

c++ - 将 C++ 数组传递给 Ada95

c++ - 将一种类型的数组转换为另一种类型

C 复制到 const char *

c - 在函数调用的参数内部定义新函数、数组、结构等

c - C中循环中的矩阵相乘

c - 在嵌入式平台上由 C 中的整数构成的指针

c++ - 显示指定地址的 16 个字节的内容(十六进制)

c - 了解我的结构的大小

swift - 我一遍又一遍地使用相同的代码块。我如何巩固它?