这是代码:
#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
将文件读入内存块,即堆。
有没有办法将文件读入堆栈?
最佳答案
当然 - 假设您的堆栈足够大,可以容纳 fileLen+1
项,您可以执行以下操作:
unsigned char buffer[fileLen+1];
并跳过最后对free()
的调用。这是可行的,因为 C99 允许您创建可变大小的数组。然而,在 C++ 中,这不起作用 *。然而,由于您的大部分程序都是用 C 语言编写的,因此您应该能够通过使用符合 C99 标准的编译器来使用标准 C 构造。
但请注意,与 malloc
不同,失败时会返回 NULL
,让您可以在文件太大时处理内存不足的情况,这种分配方式自动区域(即堆栈上)的内存将立即使您的程序崩溃。
另请注意,由于文件不是 C 字符串,因此不需要 fileLen+1
; fileLen
足以容纳整个文件。
* 有些编译器提供 C++ 语言扩展来支持可变长度数组,但生成的代码不是标准的。
关于c++ - 将二进制文件读入堆栈而不是堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656708/