【问题标题】:Making Struct object issue制作结构对象问题
【发布时间】:2021-09-26 11:46:09
【问题描述】:
struct ttype {
    int arity;
    char* items[MAX_ARITY];
};

typedef struct ttype* ntuple;

int main() {
   ntuple obj;
   put(0, "zubair", obj);
}

在编译期间,它给了我错误,未初始化的局部变量 'obj' 使用了。

【问题讨论】:

  • "错误提示我使用了未初始化的局部变量 'obj'"。局部变量不会自动初始化为任何东西。你永远不会设置obj,所以它不会被初始化并且可以包含任何垃圾值。这正是编译器告诉你的。
  • 是的,但如果我写了 obj->arity = 0;比出现同样的错误。
  • obj->arity 正在取消引用 objobj 未初始化。所以这没有任何改变。编译器消息仍然适用。
  • 您不应为此使用typedef。只需使用struct ttype * 作为类型,不要对自己隐藏信息。
  • 试着解释一下obj指向的内存。

标签: c struct


【解决方案1】:

问题

你的问题是你的 typedef typedef struct ttype* ntuple;

因此,您的路线与

   ntuple obj;

将“转换”为

    struct ttype * obj;

所以obj实际上是一个指针,它指向你内存中的一个随机地址,因为你没有初始化它。

解决方案

  1. 删除 typedef。

正如@Cheatah 已经说过的:typedef 似乎是不必要的,并且隐藏了ntuple 实际上是指针而不是结构的信息。

所以你会以下面的代码结束:

struct ttype {
    int arity;
    char* items[MAX_ARITY];
};

int main() {
   struct ttype obj;
   put(0, "zubair", &obj);
}

注意

我不知道put 函数是如何实现的,但我想第三个参数应该是对ttype 结构的引用。如果不是这样,请调整它。

  1. 保留您的 typedef 并分配一些内存

如果你真的想保留你的 typedef,那么让你的指针指向一些有效的内存空间:

struct ttype {
    int arity;
    char* items[MAX_ARITY];
};

typedef struct ttype* ntuple;

int main() {
   ntuple obj = malloc(sizeof(struct ttype));
   put(0, "zubair", obj);

   // don't forget to free this dude!
   free(obj);
}

如果您真的需要,我建议您重命名您的 typedef...例如改名为 ttype_ptr

【讨论】:

  • 如果没有 typedef,ttype obj 行是编译器错误。应该是struct ttype obj
  • 哦,是的,对不起!忘记加了,谢谢!
  • 谢谢兄弟。你的回答是我需要的。非常感谢@TornaxO7。
  • 请您将此问题标记为已回答好吗?
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多