【问题标题】:Problems allocating memory for structure为结构分配内存的问题
【发布时间】:2014-04-24 15:46:41
【问题描述】:

我有以下主要函数,它声明一个 World 结构并从存储在该结构中的 Xml 文件中读取数据:

int main(){
    World *w;
    w = create_world();
    world_load("xmlfile", w);

    return EXIT_SUCCESS;
}

World 结构的内存是通过调用函数 create_world() 分配的:

World *create_world(){
    World *w = NULL;
    if(!(w = (World *)malloc(sizeof (World)))) return NULL;

    return w;
}

世界结构如下:

struct _World {
        Space *space[MAX_SPACES + 1];
        Object *object[MAX_OBJECTS + 1];
        Link *link[MAX_LINKS + 1];
        Player *player;
};

当我执行程序时,发生了分段错误。我已经尝试通过 valgrind 并且它不断报告“条件跳转或移动取决于未初始化的值”。这可能很明显,但我就是不知道问题出在哪里……在此先感谢。

【问题讨论】:

  • 发生分段错误”在您的源代码的哪一行?此外,Valgrind 会为该消息记录哪个源文件行“”条件跳转或移动取决于未初始化的值“
  • main() 是否知道World *create_world() 是如何声明、原型化的?还是您的代码将其留给链接器以便更深入地了解彼此?
  • @alk 段错误发生在另一个函数中。我已经跟踪了 valgrind 问题的根源,它似乎在分配中。然后它将问题拖到程序崩溃为止。在main中,我包含了包含 World *create_world() 原型的标题
  • "我已经用 valgrind 追踪了问题的根源" 提供确切的代码行(加上周围)可能对试图帮助你的人非常有帮助这个代码。显示 Valgrind 日志也很有帮助。
  • "变量未初始化":尊敬的用户XYZ,请问您在说什么?可能是因为它没有被初始化?请参阅我对使用calloc() 但上面的malloc() 的评论。

标签: c malloc valgrind dynamic-memory-allocation


【解决方案1】:

我的猜测是您使用 World 结构的字段而没有实际初始化它们。由于这些字段只是指针,因此在为 World 对象分配内存时不会分配它们。这将导致访问 w->space[0] 时发生访问冲突。您应该为数组分配内存,或者从 World 结构中的数组中删除指针符号,具体取决于字段的使用方式。

【讨论】:

  • 感谢您的回答,但我不确定这是否是问题所在。当我需要指针时,我会一一分配内存,这样当我访问 w->space[0] 时,我已经为它分配了内存
  • 我仔细查看了代码,错误正是那个错误,但它在另一个函数中,与分配无关。再次感谢