指向嵌套结构中的struct的指针

sys*_*ult 3 c struct pointers

我正在尝试运行以下代码(在fedora 11 i586上的gcc 4.3中):

#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;
}
Run Code Online (Sandbox Code Playgroud)

但我在test1-> test2 [0]得到了一个段错误.smallstruct [0] .smallstruct = 123; .评论部分正在运行,没有错误.这种行为的原因是什么?我不是很精通C,所以我会感激任何帮助.

Ins*_*lah 7

我可以看到您的代码有三个问题:

  1. sizeof只告诉你指针的大小,对于32位指针是4,而不是指向的结构的大小,
  2. 即使你改变sizeof来告诉你结构的大小,malloc也只会为s_test1结构分配内存,而不是为它内部指向的结构分配内存,
  3. 最后,必须初始化test1,test2等中的指针.

这是有效的:

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;
Run Code Online (Sandbox Code Playgroud)