【问题标题】:how to access pointer member of nested structure in c code from another file如何从另一个文件访问c代码中嵌套结构的指针成员
【发布时间】:2019-01-15 13:08:12
【问题描述】:

下面是完整代码

我的问题的简要总结如下: 我在file1.c中有一个如下所述的全局结构,它通过函数“assign_value()”在file1.c中使用一些值进行初始化,现在我正在通过file2.c中的函数“print_value()”打印这个值。

问题是:另一方面,如果我在函数“assign_value()”中从 file1.c 调用“print_value()”,则它不会从 file2.c 打印正确的值,如下所述,那么它会显示正确的值。

请建议我缺少什么,为什么我无法通过调用 file2.c 中的 print_value() 函数来打印正确的值

  file1.c

My_struct_one 是包含另一个结构 My_struct_two 的嵌套结构,而 my_struct_obj_global 是 file1.c 中的全局变量

    //file1.c

    #include <stdio.h>

    #include "file1.h"

    typedef unsigned long int List;

    typedef struct
    {

     List* my_list;
    }My_struct_two;


     typedef struct
    {

     My_struct_two struct_two;
    }My_struct_one;


     My_struct_one struct_global;



      void assign_value()
     {
     List value=9;

     struct_global.struct_two.my_list = &value;
     print_value();
     }

    void print_value()
    {
    printf("inside print");
    printf("value=%u\n",*(struct_global.struct_two.my_list));
    }

file1.h //文件.h

  #ifndef _file1_c

  #define _file1_c

  void print_value();
  void assign_value();

  #endif

file2.c #包括

  #include "file1.h"

  int main()

  {

  assign_value();

  print_value();

  return 0;

   }

输出: 内部打印值 = 9 里面 printvalue=4195506

我的疑问是为什么我无法从 file2.c 访问值,

【问题讨论】:

  • 首先将通用定义和声明放在两个源文件都可以包含的头文件中。
  • 并且不要忘记,您使用的所有符号都必须在使用它们之前声明或定义。
  • 最后,听听你的编译器和它告诉你什么。 List* value=9; 是错误的。 my_struct_obj_global.my_struct_obj.my_list = &amp;value 也是如此。似乎您要么通过猜测来学习 C(这不会持续太久),要么您在阅读的任何书中跳过了几章(或者可能跳过了几节课)。我的建议是你买几本书然后重新开始。好书还会介绍如何将程序拆分成多个源文件和头文件。
  • 您是否将目标文件(file1.o 和 file2.o)链接在一起,或者您是否在 file2.c 中有包含语句(您是否包含头文件或 c 文件)?因为,在一种情况下它可能会起作用,而在另一些情况下则不会。

标签: c


【解决方案1】:
  • value 是函数 assign_value() 中的局部变量。函数进入时创建,函数返回时销毁。

  • 在函数print_value()中,struct_global.struct_two.my_list的值是一个悬空指针:它的值是一个不再存在的变量的地址。

  • 取消引用悬空指针的值是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多