正在将缓冲区/指针设置为null

Setting a buffer/pointer to null

本文关键字:设置 null 指针 缓冲区      更新时间:2023-10-16

我正试图从不同的文件中不断地将数据读取到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,11000,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);
}

我在谷歌上搜索了将缓冲区指针设置为NULL的方法,并尝试了各种建议,但似乎都不起作用。任何人都可以澄清将其设置为NULL的正确方法是什么?

您的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];

每次都会被覆盖。

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

memset(buffer, 0, 1000);

但是,在调用fread之前,不需要执行操作。根本没有理由,因为fread无论如何都会写入缓冲区:它不在乎它是否为零。


顺便说一句:您正在用我怀疑是C++的语言编写非常C化的代码(给定fstream头)。有更适合C++的I/O选项。