Указатель на вложенную структуру

88
6

Вот мой код...


#include <stdio.h>

struct one
{
struct two
{
int r;
}*b;
}*a;

void main()
{
//struct two *new = &(*a).b;
//new->r = 10;
//printf("Value: %d", new->r);
a = malloc(sizeof(struct one));
//b = malloc(sizeof(struct two));
(a->b)->r = 10;
printf("Value: %d", (a->b)->r);
return 0;

}


То, что я здесь пытаюсь, заключается в определении структуры в структуре. Теперь оба объекта должны быть указателями. Я хочу установить значение r, а затем отобразить его.


Единственное, что я получаю Segmentation Fault
используя gdb, я получил следующее, что, похоже, не очень помогает.


(gdb) run
Starting program: /home/sujal.p/structtest/main

Program received signal SIGSEGV, Segmentation fault.
0x08048435 in main ()


Я хочу знать, как выполнить указанное действие, и почему эта вещь получает ошибку сегментации. Я пробовал возможные способы, доступные на некоторых сайтах, включая Stackoverflow, некоторые из вопросов.


Прокомментированные строки - мои неудачные попытки достичь цели, но не с той же ошибкой.


РЕДАКТИРОВАТЬ После того, как вы попробуете указанные ниже методы.


void main()
{
//struct two *new = &(*a).b;
//new->r = 10;
//printf("Value: %d", new->r);

//a = malloc(sizeof(struct one));
//a my_a = malloc(sizeof*my_a);
//my_a->b = malloc(sizeof *my_a->b);
//my_a->b->r = 10;
//b = malloc(sizeof(struct two));
//(a->b)->r = 10;
//printf("Value: %d", my_a->b->r);

a = (one*)malloc(sizeof(struct one));
a->b = (one::two*)malloc(sizeof(struct one::two));
(a->b)->r = 10;
printf("Value: %d", (a->b)->r);
return 0;

}


Я пробовал все упомянутые методы, и они дают мне ошибки. Последняя ошибка, которую я получаю, выглядит следующим образом.


new.c: In function âmainâ:
new.c:24:7: error: âoneâ undeclared (first use in this function)
new.c:24:7: note: each undeclared identifier is reported only once for each function it appears in
new.c:24:11: error: expected expression before â)â token
new.c:25:13: error: expected â)â before â:â token
new.c:25:20: error: expected â;â before âmallocâ
new.c:28:2: warning: âreturnâ with a value, in function returning void [enabled by default]

спросил(а) 2021-01-25T12:45:12+03:00 5 месяцев назад
1
Решение
142

Вы удаляете ссылку на неинициализированный указатель.


Вам нужно сначала выделить экземпляр struct one:


a = malloc(sizeof *a);

то вы можете инициализировать элемент b:

a->b = malloc(sizeof *a->b);

а затем вы можете получить доступ к r:


a->b->r = 10;

Вот рабочее решение, адаптировав свой код с моим ответом.

ответил(а) 2021-01-25T12:45:12+03:00 5 месяцев назад
45

вы получаете SIGSEGV, потому что указатель для разыменования разделов


(a->b)->r

не инициализирован/определен

чтобы решить проблему, которую вам нужно выполнить


struct two
{
int r;
}

struct one
{
two *b;
};

one *a;

...

a = malloc(sizeof(struct one));
a->b = malloc(sizeof(struct two));

a->b->r = 10;
printf("Value: %d", a->b->r);
return 0;

ответил(а) 2021-01-25T12:45:12+03:00 5 месяцев назад
46

Добавив в ответ @Quonux, я бы также определил типы:


typedef struct
{
int r;
} t_two;

typedef struct
{
t_two *p_b;
} t_one;

void main()
{
t_one *p_a;

p_a = malloc(sizeof(t_one);
p_a->p_b = malloc(sizeof(t_two));

p-a->p_b->r = 10;

printf("Value: %d", p_a->p_b->r);
return 0;

}

ответил(а) 2021-01-25T12:45:12+03:00 5 месяцев назад
-4

a = malloc(sizeof(*a));
a->b = malloc(sizeof(*a->b));
a->b->r = 10;
printf("Value: %d", a->b->r);
free(a->b);
free(a);
return 0;

ответил(а) 2021-01-25T12:45:12+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема