首页 > 解决方案 > 我应该如何正确地 malloc 一个结构数组?

问题描述

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <tchar.h>
#include <string.h>
#include <math.h>


HANDLE wHnd;    // Handle to write to the console.
HANDLE rHnd;    // Handle to read from the console.


struct Terra {
    int status;
    CHAR_INFO display;

};
int main(){
    int countX = 0;
    int countY = 0;
    int total = 0;
    CHAR_INFO ScreenCon[10000];
    int localcount = 0;

    struct Terra *world= malloc(10000*sizeof(*world));
...

我一直在使用 Visual Studio 编写一个屏幕控制台程序,该程序生成并显示一个 100 x 100 CHAR_INFO 数组。不使用malloc()。我的代码引用自Ben Ryves 的 windows 控制台教程

没有malloc()函数的代码是:

struct Terra world[100][100];

这段代码运行良好,但编译器警告我应该为它分配内存。所以我尝试在其中集成内存分配,我了解到malloc()不能直接分配 2d 数组,我只能通过将我的内存块分成 100 个部分并使用 1 个额外的数组来存储它们的位置来做到这一点,我的解决方案是将 2d 数组还原为 1d 并使用额外代码处理数据位置。但是,参考堆栈溢出中的其他问题,我已将代码更改为上述代码。但是我在第 28 行收到错误代码 E0144 和 C2440,我做错了什么?

这段代码不是应该创建一个名为 world 的 struct Terra 的新指针,然后分配 10000 x 单个 Terra 的大小吗?我应该如何在声明之前初始化指针?

我已经阅读了一些关于malloc()的信息,但似乎我不明白它是如何工作的。我想知道我做错了什么。

PS:我做了更多的测试,似乎问题在于malloc()语句:

struct Terra {
    int status;
    CHAR_INFO display;
};
int main()
{
    struct Terra* world = malloc(10000 * sizeof(*world));
    return 0;
}

此代码也返回相同的错误。

标签: c

解决方案


所以,你想拥有等价的struct Terra world[100][100];, 但分配malloc而不是把它放在堆栈上,对吧?

我假设你知道你可以foo像这样分配一百个类型的对象:

foo *bar = malloc(100* sizeof(*bar));

bar现在是指向 100 数组的第一个元素的指针foo

所以在world上面的二维数组中,你有一个struct Terra长度为 100 的数组。基本上,foo是一个 100 的数组struct world

typedef struct Terra foo[100];

您现在可以分配 100 个这样的数组:

foo *world =  malloc(100* sizeof(*world));

World 现在指向 100 个此类数组中的第一个 100struct Terra个数组

当然,这可以在没有 a 的情况下完成typedef

struct Terra (*world)[100] =  malloc(100* sizeof(*world));

我知道这段文字可能是“数组数组”的混乱混乱,但我希望你明白这一点。

只是对使用的添加评论malloc。在进行这样malloc(count * sizeof(*something))的分配时: ,请务必确保乘法不会溢出。Java 虚拟机中最大的安全漏洞之一是未能进行此类检查。


推荐阅读