2013-04-10 145 views
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的值然後顯示它。

的唯一的事情我使用gdb我得到了下面的,這似乎沒有多大幫助得到它Segmentation Fault ..

(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] 

回答

9

你去引用一個未初始化的指針。

您需要首先分配的struct one一個實例:

a = malloc(sizeof *a); 

,那麼你可以初始化成員b

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

,然後你可以訪問r

a->b->r = 10; 

Here is a working solution, by adapting your code with my answer

+0

這是我得到的一個錯誤.. 。new.c:在函數中“mainâ: new.c:17:4:錯誤:預期““my_aâ new.c:18:2:錯誤:âmy_aâ未聲明(首次在此函數中使用) 新。 c:18:2:注意:每個未聲明的身份每個功能只會報告一次,它會在 新出現。c:18:12:警告:內置函數的不兼容隱式聲明:默認情況下啓用 new.c:22:2:錯誤:預計在之前打印出來 new.c:23:2警告: âreturnâ有一個值,在函數返回void [默認情況下啓用]' – 2013-04-10 10:13:18

+0

不適合我...這讓我瘋狂...這是沖洗我的觀念.. – 2013-04-10 10:24:36

+0

呃,不知道你爲什麼使用你的代碼中有大量的'::',那就是C++,而且根本不是有效的C語法。另外[應該沒有'malloc()'的返回值的轉換,在C]中(http://stackoverflow.com/a/605858/28169)。 – unwind 2013-04-10 10:29:09

0

你得到一個SIGSEGV因爲指針的間接引用謝勝利

(a->b)->r 

不是INI tialized /定義

來解決這個問題,你需要做以下

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; 
+0

是準確...但我已經試過用'(*一)(* B).r'。和'a-> b-> r',但都失敗了...... – 2013-04-10 10:10:51

+0

是的,我可以做..但它對我使用上述結構的限制... – 2013-04-10 10:15:33

-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; 
+0

謝謝..但得到了這麼多的錯誤...'new.c:在函數中âmainâ: new.c:24:7:錯誤:âoneâ未聲明(首次在此函數中使用) 新.c:24:7:注意:每個未聲明的標識符僅對於出現在 中的每個函數僅報告一次new.c:24:11:錯誤:預期表達式在標記之前 new.c:25:13:error :預期在前面的代碼中使用的值爲 new.c:25:20:error:expected●在之前的代碼中有一個值,在函數返回void [enabled默認]' – 2013-04-10 10:16:56

+1

-1在C代碼中使用'::'和無意義的轉換。 – unwind 2013-04-10 10:34:17

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; 

} 
+0

謝謝你的努力..但事情是..它是我使用上述結構的方式的一個約束..我的意思是我必須使用'struct one {struct two {int r; }; };'只有.. – 2013-04-10 10:29:47