当我将内存动态分配给保存整数值的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;
访问值或内存泄漏或内存溢出是否有任何问题?
在我的实际代码中,数据指针已经传递到不同的函数中,并在最后的单独函数中被删除。
感谢您的帮助。
答案 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个字节,所以我认为没有必要 额外的字节。
没有内存泄漏,因为你确保释放 你分配的记忆。
你说在某些其他功能中释放了内存,如果 您的程序之前退出(因为异常或逻辑退出) 达到释放记忆的功能。在这种情况下会有 是一个记忆泄漏。
答案 3 :(得分:0)
char* ptrData = new char[nElements];
将为您分配一个chars
的数组nElements
- 不包括NUL终止。因此,如果nElements = 1000
,您将为char
获得1000个空格。
如果您想手动添加\0
,则需要执行char* ptrData = new char[nElements + 1];
,然后自己将\0
设置在最后一个位置。
至于fread
,http://www.cplusplus.com/reference/cstdio/fread/说明:
“成功时读取的总字节数为(size * count)。”
因此,它不会附加\0
或任何未从您的文件中读取的内容。