Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将二进制文件读入堆栈而不是堆_C++_Memory Management - Fatal编程技术网

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

C++ 将二进制文件读入堆栈而不是堆,c++,memory-management,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 R

代码如下:

#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);
}
#包括
#包括
无效转储缓冲区(无效*缓冲区,off64缓冲区大小)
{
主任64(一);
对于(i=0;i
fread
将文件读入内存块,即堆。
是否有办法将文件读入堆栈?

当然-假设堆栈足够大,可以容纳
fileLen+1
项,则可以执行以下操作:

unsigned char buffer[fileLen+1];
并跳过最后对
free()
的调用。这是可行的,因为C99允许您创建大小可变的数组。然而,C++中,这将无法工作。但是,由于您的大多数程序都是C语言的,您应该能够通过使用符合C99标准的编译器来使用标准C结构

但是,请注意,与故障时返回
NULL
malloc
不同,它允许您在文件太大时处理内存不足的情况,这种在自动区域(即堆栈上)分配内存的方法将立即使您的程序崩溃

还要注意,由于文件不是C字符串,因此不需要
fileLen+1
<代码>文件长度
足以容纳整个文件


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

< P>当然-假设你的堆栈足够大,可以容纳<代码> FielEn+1 项目,你可以这样做:

unsigned char buffer[fileLen+1];
并跳过最后对
free()
的调用。这是可行的,因为C99允许您创建大小可变的数组。然而,C++中,这将无法工作。但是,由于您的大多数程序都是C语言的,您应该能够通过使用符合C99标准的编译器来使用标准C结构

但是,请注意,与故障时返回
NULL
malloc
不同,它允许您在文件太大时处理内存不足的情况,这种在自动区域(即堆栈上)分配内存的方法将立即使您的程序崩溃

还要注意,由于文件不是C字符串,因此不需要
fileLen+1
<代码>文件长度足以容纳整个文件


<> P>有编译器提供了一个C++语言扩展来支持可变长度数组,但是结果代码不是标准的。

< P>我认为它具有更便携性:

unsigned char buffer[MAXFILESIZE];

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

我认为如果有:

unsigned char buffer[MAXFILESIZE];

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

为什么要将其放在堆栈上?您正在读取的文件有多大?没有具体原因,只是想知道是否可以这样做,以及为什么人们通常使用堆来处理这类内容。:)堆栈可以处理多大的文件?这取决于编译器设置(至少在基于windows的系统上)。我不会尝试在堆栈上存储大小未知的对象。为什么要在堆栈上存储它?您正在读取的文件有多大?没有具体原因,只是想知道是否可以这样做,以及为什么人们通常使用堆来处理这类内容。:)堆栈可以处理多大的文件?这取决于编译器设置(至少在基于windows的系统上)。我不会尝试在堆栈上存储大小未知的对象。请注意,这需要编译器的c99支持。@vlad_tepesch“请注意,这需要编译器的c99支持”我这样做了。大多数C编译器,除了2012年以前的VS,现在都是这样。我怀疑大多数编译器是否兼容c99。这可能适用于一些最流行的PC编译器。但不是所有定制的制造商提供的嵌入式编译器。@ ununvt?“OP有一个C标记,除了C++错误的用法:STE::String ,这里没有任何C++ + SISH。但是,C++就是这样结束的。代码的其余部分是常规C:它使用
malloc
而不是
new[]
,在整个过程中使用C格式、C I/O库等等。请注意,这需要编译器的c99支持。@vlad_tepesch“请注意,这需要编译器的c99支持”我做到了。大多数C编译器,除了2012年以前的VS,现在都是这样。我怀疑大多数编译器是否兼容c99。这可能适用于一些最流行的PC编译器。但不是所有定制的制造商提供的嵌入式编译器。@ ununvt?“OP有一个C标记,除了C++错误的用法:STE::String ,这里没有任何C++ + SISH。但是,C++就是这样结束的。代码的其余部分是常规的C:它使用
malloc
而不是
new[]
,使用C格式、C I/O库等等。