为持有char *的整数分配动态内存

dynamic memory allocation for char * holding integers

本文关键字:整数 分配 动态 内存 char      更新时间:2023-10-16

当我动态分配内存到持有整数值的char*指针时,我是否需要为NULL终止总是分配一个额外的字节?

的例子:

// usually obtained a variable value by reading the header information from a binary file
int nElements = 1000; 
// Do I need to allocate nElements+1 bytes here to hold a total of nElements integer values??
char* ptrData = new char[nElements];

假设我打开了一个二进制文件,并试图读取该文件的数据,如下所示://从二进制文件中读取-127到0范围内的数据

int nElementsRead = fread(ptrData, sizeof(char), nElements,ptrFile);
// is the above operation OK or overflown by 1 byte to add/handle the NULL termination?

//Process the data 
int nInValidCount = 0;
for(int n=0; n< nElements; ++n)
if(ptrData[n] == 0) nInValidCount++; 
// do I have any problem here??
delete[] ptrData;

是否有访问值或内存泄漏或内存溢出的问题?

在我的实际代码中,Data指针在不同的函数之间传递,并在最后的单独函数中删除。

谢谢你的帮助。

为n个字符分配内存:

char* c = new char[n];

可以包含长度不超过n的字符。如果你想使用它与C-style函数依赖于'',这个数组可能包含多达n -1字符元素+终止''作为最后一个元素。

operator new不插入'',你必须自己插入,operator new [n]n元素分配空间(如果成功),而不是n + 1

  • Null终止用于c风格字符串。在你的情况下,你正在阅读从文件中取出n个字节,因此分配n个字节,所以我认为没有必要

  • 没有内存泄漏,只要你确保你释放了

  • 你说内存是在其他函数中释放的,如果您的程序退出(由于异常或逻辑退出)到达释放内存的函数。在这种情况下,会有

  • for循环内部没有问题

No。一般来说,你不必这样做。唯一的问题是,之后当你尝试,比如说,打印char数组时,你必须已经知道要打印的大小。由于末尾没有'',因此在没有被告知大小的情况下,没有其他方法可以知道所存储的字符数组的大小。

char* ptrData = new char[nElements];将为您分配一个与nElements完全相同的chars数组-不包括NUL终止。如果是nElements = 1000, char会有1000个空格

如果你想手动添加,你需要做char* ptrData = new char[nElements + 1];,然后在最后一个位置自己设置

对于fread, http://www.cplusplus.com/reference/cstdio/fread/表示:

"成功读取的总字节数为(size*count)。"

所以它不会附加或者任何它没有从你的文件中读取的东西