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

时间:2014-03-20 14:52:56

标签: c++ pointers memory

当我将内存动态分配给保存整数值的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;

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

在我的实际代码中,数据指针已经传递到不同的函数中,并在最后的单独函数中被删除。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

为n个字符分配内存:

char* c = new char[n];

这可能包含长度最高为n的字符。如果要将其与C-style函数一起使用,这些函数取决于'\0',则此数组可能包含最多n -1个char元素+终止'\0'作为最后一个元素。

operator new没有插入'\0',您必须自己插入,operator new [n]n个元素分配空间(如果成功),不是n + 1

答案 1 :(得分:0)

没有。你不必一般。唯一的事情是,稍后当你尝试打印char数组时,你必须知道要打印多少大小。由于最后没有'\ 0',因此没有其他方法可以知道存储的char数组的大小,而不会被告知大小。尝试阅读也是如此。

答案 2 :(得分:0)

  • Null Termination适用于C-Style字符串。在你的情况下,你正在阅读 从文件n个字节,因此分配n个字节,所以我认为没有必要 额外的字节。

  • 没有内存泄漏,因为你确保释放 你分配的记忆。

  • 你说在某些其他功能中释放了内存,如果 您的程序之前退出(因为异常或逻辑退出) 达到释放记忆的功能。在这种情况下会有 是一个记忆泄漏。

  • 在for循环内部没有问题

答案 3 :(得分:0)

char* ptrData = new char[nElements];将为您分配一个chars的数组nElements - 不包括NUL终止。因此,如果nElements = 1000,您将为char获得1000个空格。

如果您想手动添加\0,则需要执行char* ptrData = new char[nElements + 1];,然后自己将\0设置在最后一个位置。

至于freadhttp://www.cplusplus.com/reference/cstdio/fread/说明:

  

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

因此,它不会附加\0或任何未从您的文件中读取的内容。