добавить значение в структуру к ошибке сегментации указателя в C - PullRequest
1 голос
/ 03 февраля 2011

человек, у меня проблема сейчас ..

#include <stdio.h>
#include <stdlib.h>

typedef struct a
{
 int *aa;
 int *bb;
 struct b *wakata;
}a;

typedef struct b
{
 int *you;
 int *me;
}b;

int main()
{
a *aq;
aq = (a*)malloc(sizeof(a*));

*aq->wakata->you = 1;
*aq->wakata->me = 2;

free(aq);


return 0;
}

и скомпилирована, затем отлажена:

gcc -o tes tes.c --debug
sapajabole@cintajangankaupergi:/tmp$ gdb -q ./tes
Reading symbols from /tmp/tes...done.
(gdb) r
Starting program: /tmp/tes 

Program received signal SIGSEGV, Segmentation fault.
0x08048414 in main () at tes.c:22
22  *aq->wakata->you = 1;

хорошо, вопрос в том, как установить значение переменнойвнутри структуры 'b' через структуру 'a'?

кто-нибудь?

Ответы [ 6 ]

3 голосов
/ 03 февраля 2011

При первоначальном выделении a выделяется только 4 байта (в 32-разрядной архитектуре).Должно быть:

aq = (a*)malloc(sizeof(a));

И wakata не было инициализировано: Может быть, это:

aq->wakata = (b*)malloc(sizeof(b));

И для него потребуется также соответствующая свободная до освобождения aq.

free(aq->wakata);

И так как у вас есть указатели на целые числа, их также необходимо будет разместить (you и me).Но не ясно, если это ваша цель.Вам, вероятно, следует удалить * из объявлений int, чтобы они были просто int членами, а не указателями на int.

1 голос
/ 03 февраля 2011

Похоже, у вас здесь есть несколько ошибок. Смотрите код ниже. В общем, несколько вещей, которые нужно иметь в виду. Вы не можете получить доступ к памяти до того, как загрузите ее. Кроме того, существует разница между памятью и указателями, например, int и int *

#include <stdio.h>
#include <stdlib.h>

typedef struct a
{
 int aa;
 int bb;
 struct b *wakata;
}a;

typedef struct b
{
 int you;
 int me;
}b;

int main()
{
 a * aq = malloc(sizeof(a));

 aq->wakata = malloc(sizeof(b))
 aq->wakata->you = 1;
 aq->wakata->me = 2;

 free(aq->wakata)
 free(aq);

 return 0;
}
0 голосов
/ 03 февраля 2011

У вас есть некоторые проблемы с вашим кодом.

  1. Когда вы выделяете память для struct a, вы должны сделать

    aq = (a *) malloc (sizeof (a));

  2. Теперь вы выделили память для struct a, но не для struct b, указанного элементом wakata, поэтому вам нужно сделать

    aq-> wakata = (b *) malloc (sizeof (b));

  3. Наконец, в struct b не должно быть int* членов, ноint участников.Таким образом, вы сможете правильно присвоить им значение.

Помните, что вы должны проверить правильность выделения памяти, проверив, не возвращаемое ли значение mallocNULL.

0 голосов
/ 03 февраля 2011

Вы не выделяете место для b в структуре a.Вы определили «а» как удерживающие указатели, а не структуры.Кроме того, я думаю, что malloc (sizeof(a*)) должно быть malloc(sizeof(a))

aq = (a*)malloc(sizeof(a)); // You should probably use calloc here
aq->wakata = (b*)malloc(sizeof(b));

you и me, по-видимому, не должны быть указателями, просто обычные целые числа

0 голосов
/ 03 февраля 2011

Указатели не содержат данных.Они указывают на данные.Вот почему они называются указателями.

Когда у вас malloc достаточно места для хранения экземпляра a с именем aq, вы выделяете пространство для указателей, содержащихся в этой структуре.Вы не заставляете их указывать на что-либо, а также не выделяете пространство для размещения вещей, на которые они будут указывать.

0 голосов
/ 03 февраля 2011

wakata не указывает на допустимую память. Для этого вам нужно распределить память, а также на wakata->you и wakata->me

...