我声明了结构类型的双指针,并使用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;
}
预期结果将是打印所有“完成”的打印件,但只有首先完成的打印。
答案 0 :(得分: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
进行了更改。