Как получить доступ и изменить переменную типа указателя, объявленную внутри структуры через элемент массива, содержащий указатели на структуру? - PullRequest
0 голосов
/ 28 марта 2019

Я объявил двойной указатель типа структуры и выделил ему необходимую память, используя calloc.Затем я выделил элемент данных (указатель) необходимого пространства, но это дало ошибку ошибки сегментации.Таким образом, только готово1 печатается.Разве мы не можем получить доступ к указателям на элементы данных в такой структуре?

Я даже заменил 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 голосов
/ 28 марта 2019

Вы сделали 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 везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...