#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'中的变量?
任何人?
答案 0 :(得分:3)
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 :(得分: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->you
和wakata->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));
you
和me
似乎不需要指针,只是普通的整数
答案 5 :(得分:0)
您的代码存在一些问题。
为struct a
分配内存时,应该执行
aq =(a *)malloc(sizeof(a));
您现在为struct a
分配了内存,但没有为struct b
成员指定的wakata
分配内存,因此您需要执行
aq-&gt; wakata =(b *)malloc(sizeof(b));
最后,在struct b
中,不应该有int*
个成员,而是int
个成员。这样,您就可以正确地为它们分配值。
请记住,您应该检查malloc
返回值是否不是NULL
来检查内存的正确分配。