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

标签 c++ memory-management

这是代码:

#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+1fileLen 足以容纳整个文件。

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

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

相关文章:

c++ - 将double转换为long double的算法

c++ - C++ 中的 C2276 或 C3867 编译器错误

c++ - 我如何在屏幕空间中平铺纹理的一部分?

c++ - 使用成员函数调用可变参数模板函数

iOS : ARC, 未释放内存

java - 单独的 Java 线程中的 OutOfMemoryError

c++ - 如何在 C++ 中初始化列表 vector ?

javascript - 多个实例与具有动态内容的一个实例

c++ - 使用类型别名的可变参数模板推导

memory-management - CUDA 在 __device__ 函数中分配内存