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

时间:2014-05-14 13:54:31

标签: 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将文件读入内存块,即堆。 有没有办法将文件读入堆栈?

2 个答案:

答案 0 :(得分:2)

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

unsigned char buffer[fileLen+1];

并在结尾处跳过对free()的呼叫。这是有效的,因为C99允许您创建可变大小的数组。但是,在C ++中,这不起作用 * 。但是,由于大多数程序都在C语言中,因此您应该能够使用符合C99标准的编译器来使用标准C构造。

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

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

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

答案 1 :(得分:2)

我认为拥有以下内容会更加轻松:

unsigned char buffer[MAXFILESIZE];

然后在写入之前检查文件大小,如果文件太大则检查失败。