gpt4 book ai didi

c++ - 将二进制文件读入栈而不是堆

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:36 25 4
gpt4 key购买 nike

代码如下:

#include <stdio.h>
#include <sys/stat.h>
void dump_buffer(void *buffer, off64_t buffer_size)
{
off64_t i;
for(i = 0;i < buffer_size; ++i)
{
printf("%02x \n", ((unsigned char *)buffer)[i]);
}
printf("\n");
}

void ReadFile(std::string fn)
{
FILE *file;
file = fopen(fn.c_str(), "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", fn.c_str());
return;
}
struct stat64 fsStatBuf;
stat64(fn.c_str(), &fsStatBuf);
off64_t fileLen = fsStatBuf.st_size;
// fseek(file, 0, SEEK_END);
// fileLen=ftell(file);
// fseek(file, 0, SEEK_SET);
unsigned char *buffer;
buffer=(unsigned char *)malloc(fileLen+1);
if (!buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(buffer, 1, fileLen, file);
fclose(file);
dump_buffer(buffer, fileLen);
free(buffer);
}

fread 将文件读入一 block 内存,也就是堆。有没有办法将文件读入堆栈?

最佳答案

当然 - 假设您的堆栈足够大以容纳 fileLen+1 项,您可以这样做:

unsigned char buffer[fileLen+1];

并在最后跳过对 free() 的调用。这是可行的,因为 C99 允许您创建可变大小的数组。然而,在 C++ 中,这是行不通的 *。但是,由于您的大部分程序都是用 C 编写的,因此您应该能够通过使用符合 C99 标准的编译器来使用标准 C 构造。

但是请注意,与 malloc 不同,它会在失败时返回 NULL,让您在文件太大时处理内存不足的情况,这种分配方式自动区域(即堆栈)中的内存将立即使您的程序崩溃。

另请注意,由于该文件不是 C 字符串,因此您不需要 fileLen+1fileLen 足以容纳整个文件。

* 有些编译器提供 C++ 语言扩展以支持可变长度数组,但生成的代码不是标准的。

关于c++ - 将二进制文件读入栈而不是堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656708/

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