3

这是我的代码...

#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]
4

4 回答 4

9

您正在取消引用未初始化的指针。

您需要首先分配一个实例struct one

a = malloc(sizeof *a);

然后你可以初始化成员b

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

然后您可以访问r

a->b->r = 10;

这是一个可行的解决方案,通过使用我的答案调整您的代码

于 2013-04-10T10:10:44.760 回答
0

你得到一个 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;
于 2013-04-10T10:09:42.050 回答
0

添加到@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;

}
于 2013-04-10T10:28:04.317 回答
-1
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;
于 2013-04-10T10:15:14.357 回答