繁体   English   中英

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

[英]Pointer to struct within the nested structs

我正在尝试运行以下代码(在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-> test2 [0]得到了一个段错误.smallstruct [0] .smallstruct = 123; 评论部分正在运行,没有错误。 这种行为的原因是什么? 我不是很精通C,所以我会感激任何帮助。

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

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

这是有效的:

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;

尝试改变:

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个字节。

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

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

我编译了问题海报@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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM