【问题标题】:Creating a three dimensional struct array on the heap in c在c中的堆上创建一个三维结构数组
【发布时间】:2018-05-14 04:34:49
【问题描述】:

我正在尝试在 MSVC 的 c 中使用 malloc 创建一个三维结构数组。它编译没有错误,但是当我调试它时,它在初始化一些元素后给出了错误。

声明:

typedef struct table_info
{
    unsigned long size;
    char code[33];
    char path[300];
}table_info;

table是一个全局变量,定义为:

struct table_info ***table=NULL;

malloc 并初始化table:

char garb[33] = { '\0' };
char garb_path[300] = { '\0' };

table = (table_info***)malloc(ROWS* sizeof(**table));

for (int m = 0; m < ROWS; m++)
{
    table[m] = (table_info**)malloc(COLS* sizeof(*table[m]));
    for (int j = 0; j < COLS; ++j)
    {
        table[m][j] = (table_info*)malloc(DEPTH * sizeof(table[m][j]));
        for (int k = 0; k < DEPTH; ++k)
        {
            table[m][j][k].size = 0;
            strcpy_s(table[m][j][k].code, sizeof(table[m][j][k].code), garb);
            memcpy(table[m][j][k].path, garb_path, sizeof(garb_path));
        }
    }
}

我是否正确初始化它?或者我应该更正什么才能使其正常工作?

【问题讨论】:

  • struct table_info ***table ==> struct table_info (*table)[COLS][DEPTH];table = (table_info***)malloc(ROWS* sizeof(**table)); ==> table = malloc(ROWS * sizeof *table); 如果你想要一个真正的 3D 数组,请删除另一个 mallocs。
  • Three stars 经常表示设计错误。

标签: c visual-c++ multidimensional-array struct malloc


【解决方案1】:

以下行中传递给malloc 的大小不正确:

table[m][j] = (table_info*)malloc(DEPTH * sizeof(table[m][j]));

sizeof(table[m][j]) 就是sizeof(**table),也就是sizeof(table_info *)。它应该是sizeof(table_info),或者sizeof(*table_info[m][j])sizeof(***table_info)

您也不需要转换 malloc 的结果,这在今天通常是不受欢迎的(至少在 C 中)。请参阅this post 了解更多信息。

所以以下应该可以工作(在 C 中):

table[m][j] = malloc(DEPTH * sizeof(*table[m][j]));

【讨论】:

  • 我正在强制转换,否则 MSVC 会给我错误,说我不能将 void* 分配给结构指针。但我认为您的解决方案已经奏效。让我再检查一次,然后回复你
  • 如果需要强制转换,您正在编译 C++ 程序,而不是 C 程序。
  • @mch 啊,好吧 - 我正在输入 C 标签。
  • @TomKarzes 我的评论是对 OP 的暗示,他可能不会编写 C 程序 ;)
  • 你是对的@mch 我正在将一个 c 程序编译为 c++。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2012-06-10
  • 2011-11-06
  • 2016-07-28
  • 2019-01-05
  • 2016-02-28
相关资源
最近更新 更多