c - 我应该如何正确地 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;
}
此代码也返回相同的错误。
解决方案
所以,你想拥有等价的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 虚拟机中最大的安全漏洞之一是未能进行此类检查。
推荐阅读
- r - R中的grepl()使用具有多个AND,OR的复杂模式
- python - AWS Lambda 错误(未安装 tesseract)
- android - React Native Expo (Android) 本地化 - 默认为 92(全部?)本地化
- c# - 对不使用 IDisposable 的框架组件使用 .NET 分析器规则 CA1001
- vue.js - 如何在引导 vue 中输入标签时显示建议列表?
- django - Django:form.is_valid() 错误,但仅在“if request.method == 'POST'”之后?
- python - 如何使用盈透证券 API 执行监管快照?
- cypress - 使用 Cypress.IO 访问 SalesForce
- python - Odoo 模型继承问题
- python - 如何将 Celery 与 redis 连接起来?