2013-10-15 42 views
0

我正在写一个函数,允许某人扩展一个char *数组,并且在做一些测试时我注意到,当我放入3个以上的元素时,第二个变成了损坏的东西。多次realloc调用后第二个字符串损坏

这是函数本身:

void Data::PushBack_String(char** PtrToPtr, char* Ptr, unsigned short Index) 
    { 
     unsigned short String_Length; 
     for(String_Length = 0; Ptr[String_Length] != '\0'; ++String_Length); 
                  ++String_Length; 

     char* NewPtr = (char*)malloc(String_Length); 
     strcpy(NewPtr, Ptr); 

     PtrToPtr = (char**)realloc(PtrToPtr, Index); 
     PtrToPtr[Index] = NewPtr; 
    } 

还注意到,当元件的数量超过17种元素的程序崩溃。

+1

我可以想到学术课程以外没有任何理由为什么你不使用'std :: unordered_map '完成这个任务。 – WhozCraig

+0

我知道有这样的最简单的方法,但我想学习如何操作动态数组。 – EnryFan

+0

你计算'String_Length'的方式是错误的。你在每个循环中增加两次'String_Length'。如果长度奇数,它会传递字符串的末尾。 –

回答

0

正确使用malloc就像是malloc(String_Length * sizeof(char)+1)。您应该在字符串中添加1以结束'\0'

0

您可以尝试使用strdup()来代替。它将覆盖用于NULL终止的一个字节,您忘记了。它更可读。