2009-07-26 160 views
3

我想要(在Fedora在GCC 4.3 11點i586的)運行下面的代碼內的結構:指針到嵌套結構

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

struct s_smallstruct{ 
    int smallstruct; 
};      

struct s_test2{ 
     char * test2; 
     struct s_smallstruct* smallstruct; 
}; 

struct s_test3{ 
     char * test3; 
     struct s_smallstruct * smallstruct; 
}; 

struct s_test1{ 
     char * test1; 
     struct s_test2 * test2; 
     struct s_test3 * test3; 
}; 


int main(){ 
     struct s_test1 *test1 = (struct s_test1 *) malloc(sizeof test1); 
     test1->test2[0].smallstruct[0].smallstruct = 123; 
     int num = test1->test2[0].smallstruct[0].smallstruct; 
//  struct s_smallstruct * smallstruct = (struct s_smallstruct *) malloc(sizeof smallstruct); 
//  smallstruct[0].smallstruct =12; 
//  int num = smallstruct[0].smallstruct; 
     printf("%d\n" , num); 
     return EXIT_SUCCESS; 
} 

但我拿到test1-> TEST2段錯誤[0]。 smallstruct [0] .smallstruct = 123; 。評論部分運行時沒有錯誤。這種行爲的原因是什麼?我不是很擅長C,所以我會很感激任何幫助。

+0

這不是一個解決方案,但總是檢查* ALLOC! – 2011-04-16 20:17:00

回答

7

有三個問題與您的代碼,我可以看到:

  1. 的sizeof只告訴你的指針,這是4 32位指針,而不是結構的尺寸大小指向,
  2. ,即使你改變的sizeof告訴你結構的大小,的malloc將只爲s_test1結構分配內存,而不是被指出要在IT,
  3. 結構
  4. 最後,測試1中的指針,測試2等必須被初始化。

下面是一些作品:

const int length = 2;  
struct s_test1 *test1 = malloc(length * sizeof *test1); 
test1->test2 = malloc(length * sizeof *test1->test2); 
test1->test2->smallstruct = malloc(length * sizeof *test1->test2->smallstruct); 
test1[1].test2[0].smallstruct[1].smallstruct = 123; 
int num = test1[1].test2[0].smallstruct[1].smallstruct; 
1

嘗試改變:

struct s_test1 *test1 = (struct s_test1 *) malloc(sizeof test1); 

struct s_test1 *test1 = (struct s_test1 *) malloc(sizeof struct s_test1); 

test1是一個指針,它在32位的環境中是4個字節。

+0

更好的是:malloc(sizeof * test1); – 2009-07-26 22:41:55

1

你是不是對分配的內部結構的內存。 sizeof(test1)只有3個指針的空間,而不是結構的整個結構。

另外,該語句中有5個(!)取消引用操作符。即使你已經分配了足夠大的內存,你也沒有以確保它連續的方式來佈置 - 你要求它從塊跳到塊5次。

0

我編譯了由問題海報@systemsfault選中的標記爲正確的代碼,但得到了核心轉儲。我希望能夠在這裏進行健康有益的討論,爲問題提供正確的解決方案。我對stackoverflow也很新,所以如果我說錯了什麼,請隨時糾正我。現在,我們開始吧...

由於舊的解決方案沒有完成,我嘗試修復它的兩個步驟。首先,我添加了for循環,但仍然由(a1)和(a2)引起了核心轉儲。接下來,我用行(b1)和(b2)來代替(a1)和(a2)。現在它編譯並正確運行。

我已經清理了結構,使之simplier閱讀:

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

struct s_smallstruct{ 
    int smallstruct; 
};      

struct s_test2{ 
    struct s_smallstruct *smallstruct; 
}; 

struct s_test1{ 
    struct s_test2 *test2; 
}; 

int main() { 
    int i, j, length = 2;  

    struct s_test1 *test1 = malloc(length * sizeof *test1); 

    for (i=0; i<length; i++) { 
    //test1[i].test2 = malloc(length * sizeof *test1->test2);//(a1) 
    test1[i].test2 = malloc(length * sizeof *test1[i].test2);//(b1) 

    for (j=0; j<length; j++) { 
     //test1[i].test2[i].smallstruct = malloc(length * sizeof *test1->test2->smallstruct);//(a2) 
     test1[i].test2[j].smallstruct = malloc(length * sizeof *test1[i].test2[j].smallstruct);//(b2) 
    } 
    } 

    test1[1].test2[0].smallstruct[1].smallstruct = 123; 
    int num = test1[1].test2[0].smallstruct[1].smallstruct; 
    printf("num:%d\n", num); 
    return 0; 
}