我声明了一个结构类型的双指针,并使用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]->a
当q[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/