gpt4 book ai didi

c - .exe 中嵌入的二进制资源以及加载时的内存管理

转载 作者:行者123 更新时间:2023-11-30 15:40:49 24 4
gpt4 key购买 nike

我正在编写一个小型 C 程序,我需要将二进制数据嵌入到 exe 文件中。我使用的方法是将二进制数据转换为 char[] 数组...但我没有直接将该数组包含为全局变量;相反,我将该数组复制到一个函数 (LoadResource) 中,该函数在堆上动态创建一个数组,并在其中复制原始数据。这就是我的意思:

char *dataPntr;

void LoadResource()
{
char data[2048] = {/*my binary data */};

dataPntr = malloc(2048);

for (int i = 0; i < 2048; i++) dataPntr [i] = data[i];
}

这样,如果我的理解是正确的,当调用LoadResource()时,data[]将被放置在堆栈中,复制到堆中,最后data[]将自动从堆栈中释放;应使用 free() 手动释放堆副本。

我这样做是因为资源仅在某些情况下使用,而不是总是......而且我更喜欢避免使用大型全局变量。

我的问题:

运行程序时,data[]数组是否放置在内存中的某个位置?也许是文本段?或者它只是在调用 LoadResource() 时加载到堆栈中?

我的解决方案是否正确(就内存管理而言),还是直接声明一个全局数据数组会更好?

感谢您的回答!

最佳答案

一般来说,避免使用全局变量是个好主意。我不会说您永远不需要它们,但调试它们可能会很痛苦。问题是很难追踪谁最后更改了它。如果您曾经做过任何多线程,那么您将永远不想再看到全局!

我在这些评论中包含了您的 char *dataPntr - 为什么这是全局的?返回指针可能会更好。

不确定为什么要在堆栈上使用数组(data),我的猜测是这样您可以使用{...}初始化语法。你能避免这种情况吗?这可能没什么大不了的,2k 不是一个很大的开销,但也许它可能会增长?

我个人会使用memcpy()复制数据

您的代码中有几个“神奇数字”,2048 和 2018。也许其中一个是拼写错误?为了避免此类问题,大多数人会使用预处理器宏。例如:

#include <string.h>      /* for memcpy() */

#define DATA_SIZE 2048

char * LoadResource(void)
{
char data[DATA_SIZE] = {/*my binary data */};

char * dataPntr = malloc(DATA_SIZE);

if (dataPntr)
memcpy(dataPntr, data, DATA_SIZE);

return dataPntr;
}

顺便说一句,请注意 LoadResource 的原型(prototype)为 void。在 C(不是 C++)中,空参数列表意味着没有参数检查,而不是没有参数。另请注意,我检查了 malloc 返回的值。这意味着该函数将在出错时返回NULL

另一种策略可能是使 data 数组变为static,但是具体何时初始化取决于编译器,您可能会发现甚至会产生内存开销如果你不使用它。

关于c - .exe 中嵌入的二进制资源以及加载时的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com