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

时间:2009-07-26 21:44:19

标签: c pointers struct

我正在尝试运行以下代码(在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;
}

但我在test1-&gt; test2 [0] .smallstruct [0] .smallstruct = 123; 。评论部分正在运行,没有错误。这种行为的原因是什么?我对C不太熟练,所以我会感激任何帮助。

4 个答案:

答案 0 :(得分:7)

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

  1. sizeof 只告诉你指针的大小,对于32位指针是4,而不是指向的结构的大小,
  2. 即使您更改sizeof以告诉您结构的大小, malloc 也只会为 s_test1 结构分配内存,而不是为指向的结构分配内存从里面,
  3. 最后, test1 test2 等中的指针必须初始化。
  4. 这是有用的:

    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 :(得分: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个字节。

答案 2 :(得分:1)

您没有为内部结构分配任何内存。 sizeof(test1)只有足够的空间容纳3个指针,而不是结构的整个结构。

另外,该语句中包含5个(!)解除引用运算符。即使你已经分配了足够大的内存块,你也没有以确保它连续的方式放置东西 - 你要求它从一个块跳到另一个块5次。

答案 3 :(得分:0)

我编译了问题海报@systemsfault选择的标记为正确的代码,但是核心转储了。我希望在这里有一个健康和有益的讨论,为这个问题提供正确的解决方案。我也是stackoverflow的新手,所以如果我说错了,请随时纠正我。现在,我们走了......

由于旧的解决方案没有完成,我试图解决它的两个步骤。首先,我添加了for循环,但仍然由(a1)和(a2)引起了核心转储。

接下来,我用线(b1)和(b2)代替(a1)和(a2)。现在它编译并正确运行。

我已经清理了结构,使其更易于阅读:

#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;
}