【问题标题】:Memory Allocating (malloc) a Struct Array内存分配 (malloc) 结构数组
【发布时间】:2021-05-29 13:46:18
【问题描述】:
#include <stdlib.h>
#include <stdio.h>
struct CELL {
    char* data;
    struct CELL* next;
} ;

struct CELL* table;

// The line below gives an error
table = malloc(SIZE * sizeof(struct HASHCELL));

我正在尝试使用 malloc 创建一个 struct CELL 数组。

但是,这样做会给出“警告:缺少类型说明符,默认为 'int' [-Wimplicit-int]”。因此,它给出了“错误:用不同类型重新定义'table':'int' vs 'struct CELL *”。我是 C 新手,我不确定为什么会这样。

【问题讨论】:

  • 你用的是什么编译器?
  • edit 并显示minimal reproducible example。我试过this code,它编译得很好。
  • @Jabberwocky 这就是我现在所拥有的。感谢您编译它。我不确定为什么它对我不起作用。
  • 投票重新打开,以便可以作为副本关闭。 (应该可以选择投票来更改关闭原因。)
  • @Jabberwocky 发生了什么?我们重新打开它,然后作为副本关闭,然后您重新打开它......再次?我很困惑。

标签: c struct malloc


【解决方案1】:

table = malloc(SIZE * sizeof(struct HASHCELL)); 是一个语句(它是一个表达式语句)。语句不能写在函数之外。在函数之外,你只能有声明和预处理指令。 (在 C 标准中,声明与语句是分开的。)

当编译器看到table 时,它期待一个声明,但这不是一个声明,因为没有类型,如int tablestruct Cell table。编译器正在应用默认类型 int 并警告您。

然后,因为您有一个较早的声明 struct CELL *table;,这个 int table 的新“声明”与之前的声明冲突,因此编译器会警告您。

解决办法是为你的程序写一个函数,比如main函数,把table = malloc(SIZE * sizeof(struct HASHCELL));放在里面。

您可能还希望在函数内移动struct CELL *table;;使用在函数之外定义的变量通常是不好的做法。

【讨论】:

    【解决方案2】:

    确保在结构定义的末尾关闭分号。

    struct CELL {
        char *data;
        struct CELL* next;
    };
    

    确保在调用之前包含定义了 malloc() 的 标准库。

    将 malloc 的返回类型转换为

    table = (struct CELL*)malloc(100 * sizeof(struct CELL));
    

    因为 malloc 总是将void * 返回到分配的内存。

    使用命令行 gcc 编译您的源代码,以确保您在 vs 代码中没有任何可能导致问题的库配置问题。

    【讨论】:

    • C 不需要在作业中强制转换 void *;它会自动转换为目标类型,并且使用强制转换有时会掩盖错误。
    • 这是一个评论而不是一个答案。
    • 同意上面的cmets,OP的代码已经有了这里提到的一切,演员表是隐式的。第二部分,可能有用,但也更多是评论,如果我可以添加它,我会要求他在编译时包含所有警告
    • 在 C 中你真的是 shouldn't cast the result of malloc
    • @Someprogrammerdude 太棒了,这很有趣
    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2015-06-27
    • 2014-04-21
    • 2017-05-29
    相关资源
    最近更新 更多