在C中为struct指针分割错误添加值

时间:2011-02-02 23:29:24

标签: pointers struct segmentation-fault

人们,我现在有一个问题..

#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;

嗯,问题是,如何通过struct'a'将值设置为struct'b'中的变量?

任何人?

6 个答案:

答案 0 :(得分:3)

a的初始分配仅分配4个字节(在32位架构中)。它应该是:

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

并且wakata尚未初始化:也许这样:

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

在免费aq之前,它还需要相应的免费。

free(aq->wakata);

由于您有指向整数的指针,因此还需要分配(youme)。但目前尚不清楚这是否是你的目标。您可能应该从int声明中删除*,以便它们只是int成员而不是指向int的指针。

答案 1 :(得分:1)

看起来你在这里犯了一些错误。请参阅下面的代码。 一般来说,要记住一些事情。 malloc之前你无法访问内存。此外,存储器和指针之间存在差异,例如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;
}

答案 2 :(得分:0)

wakata未指向任何有效内存。您必须为它设置malloc内存,然后还需要wakata->youwakata->me

答案 3 :(得分:0)

指针不包含数据。他们指向数据。这就是为什么它们被称为指针。

malloc有足够的空间来存储名为a的{​​{1}}实例时,可以为该结构中包含的指针分配空间。你不会让它们指向任何东西,也不会分配空间来包含它们指向的东西。

答案 4 :(得分:0)

您没有为结构b中的a分配空间。您已将'a'定义为保持指针,而不是结构。另外,我认为malloc (sizeof(a*))应该是malloc(sizeof(a))

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

youme似乎不需要指针,只是普通的整数

答案 5 :(得分:0)

您的代码存在一些问题。

  1. struct a分配内存时,应该执行

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

  2. 您现在为struct a分配了内存,但没有为struct b成员指定的wakata分配内存,因此您需要执行

    aq-&gt; wakata =(b *)malloc(sizeof(b));

  3. 最后,在struct b中,不应该有int*个成员,而是int个成员。这样,您就可以正确地为它们分配值。

  4. 请记住,您应该检查malloc返回值是否不是NULL来检查内存的正确分配。