【问题标题】:Pointer to struct within the nested structs指向嵌套结构中的结构的指针
【发布时间】:2010-11-14 05:05:51
【问题描述】:

我正在尝试运行以下代码(在 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 不是很精通,所以我会很感激任何帮助。

【问题讨论】:

  • 这不是解决方案,但始终检查 *ALLOC!!

标签: c pointers struct


【解决方案1】:

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

  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;

【讨论】:

    【解决方案2】:

    尝试改变:

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

    【讨论】:

    • 更好的是:malloc( sizeof *test1 );
    【解决方案3】:

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

    另外,该语句中有 5 个 (!) 取消引用运算符。即使你分配了足够大的内存块,你也没有以确保它是连续的方式布局——你要求它从一个块跳到另一个块 5 次。

    【讨论】:

      【解决方案4】:

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

      由于旧解决方案无法编译,因此我尝试通过 2 个步骤进行修复。首先,我添加了 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多