将缓冲区/指针设置为null

时间:2012-08-22 18:06:10

标签: c++ pointers buffer fread

我试图不断地从不同的文件中将数据读入unsigned char *类型的缓冲区。但是,在读取下一个文件之前,我似乎无法将缓冲区设置为NULL。

这里只是相关代码:

#include <stdio.h>
#include <fstream>


int
 main (int argc, char** argv) { 

     FILE* dataFile = fopen("C:\\File1.txt", "rb");
     unsigned char *buffer = NULL;
     buffer = (unsigned char*)malloc(1000); 
     fread(buffer,1,1000,dataFile);
     fclose(dataFile);

     dataFile = fopen("C:\\File2.txt", "rb");
     buffer = NULL;
     fread(buffer,1,1000,dataFile);
     fclose(dataFile);

     system("pause");
     return 0; 

}

我遇到的错误是第二次出现这一行: fread(buffer,1,1000,dataFile);

我得到的错误是:

  

调试断言失败!   表达式:(缓冲区!= NULL)

它指向了fread.c的第147行,基本上是:

/* validation */
_VALIDATE_RETURN((buffer != NULL), EINVAL, 0);
if (stream == NULL || num > (SIZE_MAX / elementSize))
{
    if (bufferSize != SIZE_MAX)
    {
        memset(buffer, _BUFFER_FILL_PATTERN, bufferSize);
    }

    _VALIDATE_RETURN((stream != NULL), EINVAL, 0);
    _VALIDATE_RETURN(num <= (SIZE_MAX / elementSize), EINVAL, 0);
}

我为Google提供了将缓冲区指针设置为NULL的方法,并尝试了各种建议,但似乎都没有。任何人都可以澄清将它设置为NULL的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

你不能说buffer = NULL,因为fread会尝试取消引用它。解除引用NULL是C ++中肯定完全违法的事情之一。实际上,你失去了从malloc得到的东西。也许你正在寻找memset并试图将缓冲区归零:

memset(buffer, 0, 1000);

但是,在调用fread之前,您无需执行此操作。没有理由,因为fread无论如何都会写缓冲区:它不关心它是否归零。


作为旁注:您正在编写非常C-ish代码,我怀疑是C ++(给定fstream标题)。 C ++有更适合的I / O选项。

答案 1 :(得分:5)

您的buffer指针

执行此操作时:

buffer = (unsigned char*)malloc(1000); 

在内存中分配一些空间,并将其起始位置指定给buffer。请记住,buffer保存空间开头的地址,这就是全部。当你这样做时:

buffer = NULL;

你扔掉了那个地址。

修改

C ++风格,没有动态内存:

#include <fstream>    
using std:: string;
using std:: ifstream;

void readFromFile(string fname)
{
  char buffer[1000];
  ifstream fin(fname.c_str());
  fin.read(buffer, sizeof(buffer));
  // maybe do things with the data
}

int main ()
{
  readFromFile("File1.txt");
  readFromFile("File2.txt");
  return 0;
}

无需删除缓冲区的内容。如果每次调用分配和释放缓冲区的成本太高,只需添加static

  static char buffer[1000];

每次都会被覆盖。