正在将缓冲区/指针设置为null
Setting a buffer/pointer to null
我正试图从不同的文件中不断地将数据读取到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选项。
相关文章:
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 删除对象与将指针设置为 null
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- STD :: Sort将数组指针设置为NULL
- 设置 NULL 会导致滞后,[MAX_STRING_LENGTH] = {'\0'};
- 一旦对象设置为 null,用于声明对象的堆大小的变量就设置为 null?
- 将结构元素地址设置为C 中的null(单链接列表)
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 删除指针并将指针设置为null之间有什么区别
- 为什么我们需要在move构造函数中将右值引用设置为null
- 将数组中的元素设置为 0 或 NULL
- SQLBindParam:设置 Null 值失败 (ODBC)
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- WCHAR_T设置为c 中的null
- 当我要删除它时,指针甚至无法设置为null
- 将对象的数组设置为c 中的null
- 智能指针:通过引用设置、重置、设置null、null检查或重置检查
- c++无法为包含静态变量的对象设置NULL指针