【问题标题】:Compilation error - Variable pointer is uninitialized when used here编译错误 - 此处使用时变量指针未初始化
【发布时间】:2021-07-05 16:46:22
【问题描述】:
#include <stdio.h>

#define LENGTH_OF_A_MACRO    5

struct structS{
    unsigned int scgsToTrace[LENGTH_OF_A_MACRO];
    unsigned int noOfScgsToTrace;
} structS;

int main()
{
  unsigned int scgsToTrace[LENGTH_OF_A_MACRO] = {0};
  unsigned int noOfScgToTrace = 0;

  structS* commonData_p;
  noOfScgToTrace = commonData_p->noOfScgsToTrace; //Q1: Compilation Error

  for (unsigned int i = 0; i < noOfScgToTrace; i++) //Q2: noOfScgToTrace garbage value?
  {
    unsigned int scgToTrace = scgsToTrace[i];
    ...............................
   }
   return 0;
}

我正在尝试使用指针变量 commonData_p 从 structS 分配 noOfScgsToTrace。 但是我在这里收到一个编译错误,说变量“commonData_p”在此处使用时未初始化,如上面评论附近所述。我应该明确初始化它吗?如何? 我这里有两个问题

问题1:为什么这里说的是未初始化? 问题2:如果将noOfScgToTrace初始化为0,如果没有正确分配,它是否认为该值是for循环中的垃圾值?

非常感谢任何帮助。提前致谢!

【问题讨论】:

  • 如果你typedefine:typedef struct { ... } structS;,我想你会走得更远。否则,名为 structSstruct structS 实例会妨碍您。 commonData_p 未初始化,因此取消引用它具有未定义的行为。
  • @evt 这个指针在哪里 structS* commonData_p;点?

标签: c pointers struct compiler-errors initialization


【解决方案1】:

您忘记命名commonData_p 的类型,这就是您收到编译错误的原因。你也忘了初始化它:

struct structS* commonData_p = &structS; // note "struct structS"

Demo

注意:

您的noOfScgToTrace = commonData_p-&gt;noOfScgsToTrace; 很好,因为全局structS 会自动初始化(为零),但是如果您将声明移动到一个函数中,例如main,它已经未初始化并且读取它会使您的程序有未定义的行为。

【讨论】:

  • 您是否建议将指针声明移动到主函数参数中?我试过你的建议,它没有用。你能写几行吗?谢谢!
  • @revt 不,我建议您先添加struct(因为类型是struct structS*,而不是structS*,因为您没有typedefine 它)您还为其分配了一个值 (&amp;structS)。我在答案中添加了一个演示。
  • 好的,知道了。这是很好的输入。如果我有 typedef struct {} 怎么初始化更改?
  • @revt 不,初始化不会改变。 typedefining 只给你一个别名,所以你不用每次想使用那个类型时都写struct structSexample - 请注意,我将类型命名为 structS_t 而不是 structS。变量名称与类型名称相同会​​使所有内容难以阅读。 :-) 另请注意,当我将声明移至 main 时,我将 structS 初始化为零。
  • @revt 上面的错字:应该是“...所以你没有必须写...”:-)
【解决方案2】:

嗯,你有一个结构structS 和一个指向这种类型的指针commonData_p。但是你从来没有为那个指针分配任何东西——它是未初始化的。你需要延长线

 struct structS* commonData_p = &structS; 

为了让编译器知道指向哪里。

【讨论】:

    【解决方案3】:

    这个编译错误

    编译错误 - 此处使用时变量指针未初始化

    意味着两件事。

    第一个是在你的问题中输入代码你通过省略 typedef 说明符打错了。那是而不是

    struct structS{
        unsigned int scgsToTrace[LENGTH_OF_A_MACRO];
        unsigned int noOfScgsToTrace;
    } structS;
    

    应该有

    typedef struct structS{
        unsigned int scgsToTrace[LENGTH_OF_A_MACRO];
        unsigned int noOfScgsToTrace;
    } structS;
    

    否则编译器会发出另一个错误。

    第二个是你声明了一个未初始化的指针

    structS* commonData_p;
    noOfScgToTrace = commonData_p->noOfScgsToTrace; //Q1: Compilation Error
    

    具有不确定的价值。因此编译器会发出一个错误,提示您尝试使用未初始化的指针访问内存 (commonData_p-&gt;noOfScgsToTrace)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多