第二个字符串在多次重新分配调用后损坏
Second string corrupt after multiple realloc calls
我正在编写一个函数,允许某人扩展 char* 数组,在做一些测试时,我注意到当我放置超过 3 个元素时,第二个元素会损坏。
这是函数本身:
void Data::PushBack_String(char** PtrToPtr, char* Ptr, unsigned short Index)
{
unsigned short String_Length;
for(String_Length = 0; Ptr[String_Length] != ' '; ++String_Length);
++String_Length;
char* NewPtr = (char*)malloc(String_Length);
strcpy(NewPtr, Ptr);
PtrToPtr = (char**)realloc(PtrToPtr, Index);
PtrToPtr[Index] = NewPtr;
}
还注意到,当元素数量超过 17 个元素时,程序崩溃。
正确
使用malloc
就像malloc(String_Length * sizeof(char)+1)
。您应该添加 1 以说明字符串中的结束' '
。
您可以尝试改用strdup()
。它将覆盖您忘记的 NULL 终止的一个字节。而且它的可读性要强得多。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- unique_ptr:在分配之前调用 reset 有什么效果
- 调用析构函数以释放动态分配的内存
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- C++析构函数调用两次,堆栈分配的复合对象
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 在之后仍需要使用源对象时调用父移动分配运算符
- 为什么调用移动分配?
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 如何为包含最多N个元素的std::multiset调用最大数量分配
- 通过外部分配的数据调用特征 GEMM
- C++ - 从移动分配运算符调用复制分配
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- 默认移动分配调用析构函数,复制分配不
- C++:自动向量重新分配调用复制构造函数?为什么
- 第二个字符串在多次重新分配调用后损坏
- Windows堆分配调用堆栈-奇怪的调用堆栈
- 是否有一个位集类在实例化时大小,但避免了 boost::d ynamic_bitset<> 的额外分配调用?