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

时间:2019-03-28 13:55:14

标签: 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;
}

预期结果将是打印所有“完成”的打印件,但只有首先完成的打印。

1 个答案:

答案 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进行了更改。