C++ Realloc char*内部结构
我是C编程新手, 我有一个带有char和int指针的结构,我经常修改这个指针,char*和它的工作很好,但当我使用内部结构时,同样的事情意味着问题出现了C++ Realloc char*内部结构,c++,c,pointers,realloc,C++,C,Pointers,Realloc,我是C编程新手, 我有一个带有char和int指针的结构,我经常修改这个指针,char*和它的工作很好,但当我使用内部结构时,同样的事情意味着问题出现了 typedef struct MyStruct { int* intPtr; char* strPtr; } Mystruct; 内部main() 我在重新分配char*内部指针时发现以下错误 这可能是由于堆损坏,这表明它加载的DLL中或任何DLL中存在错误 这里的问题是,在分配内存之后 myStructPtr->st
typedef struct MyStruct
{
int* intPtr;
char* strPtr;
} Mystruct;
内部main()
我在重新分配char*内部指针时发现以下错误
这可能是由于堆损坏,这表明它加载的DLL中或任何DLL中存在错误
这里的问题是,在分配内存之后
myStructPtr->strPtr = (char *)malloc(sizeof("original"));
您正在覆盖返回的指针
myStructPtr->strPtr = "original";
然后,尝试对内存分配器函数未返回的指针使用realloc()
。这导致了
引用章节§7.22.3.5中的C11
如果ptr
是空指针,则realloc
函数的行为类似于
指定的大小。否则,如果ptr
与内存先前返回的指针不匹配
管理功能,或者如果通过调用空闲
释放空间,或者
realloc
函数,行为未定义。[…]
也就是说,您不应该使用%u
打印指针本身,您必须使用%p
格式说明符并将相应的参数强制转换为(void*)
解决方案您应该
- 在malloc()之后,用于将内容复制到分配的内存区域,该区域由
call返回的指针指向malloc()
- 摆脱malloc()并使用非标准的
- 这里的问题是,在分配内存之后
myStructPtr->strPtr = (char *)malloc(sizeof("original"));
您正在覆盖返回的指针
myStructPtr->strPtr = "original";
然后,尝试对内存分配器函数未返回的指针使用realloc()
。这导致了
引用章节§7.22.3.5中的C11
如果ptr
是空指针,则realloc
函数的行为类似于
指定的大小。否则,如果ptr
与内存先前返回的指针不匹配
管理功能,或者如果通过调用空闲
释放空间,或者
realloc
函数,行为未定义。[…]
也就是说,您不应该使用%u
打印指针本身,您必须使用%p
格式说明符并将相应的参数强制转换为(void*)
解决方案您应该
- 在malloc()之后,用于将内容复制到分配的内存区域,该区域由
call返回的指针指向malloc()
- 摆脱malloc()并使用非标准的
const char* originalStr = "original";
memcpy ( myStructPtr->strPtr, originalStr , strlen(originalStr)+1 );
malloc分配内存并将地址存储在mystructtptr->strPtr中。然后重新设计指向字符串常量“original”位置的指针 无法重新分配字符串consant的位置 您应该将其复制到指针所指向的位置,而不是将原始文件指定给指针
const char* originalStr = "original";
memcpy ( myStructPtr->strPtr, originalStr , strlen(originalStr)+1 );
这不是C。C没有代码>新< /COD>作为关键字。为什么你把C和C++混合?
new
和malloc
?!我用C++项目,因为我发现在分配新关键字时有困难,我用Maloc,这不是C。C没有代码>新< /Cord>作为关键字。为什么你把C和C++混合?new
和malloc
?!我使用C++项目,因为我发现为char分配新关键字很困难。我用Malc HethANKS来响应@ Sourav Ghosh,但是如果我使用StrucYe()或StrudUp(),这将创建新的地址。我希望我的char*类型为realloc大小和值,地址相同。可能吗?因为我发现char*address即使在@VËVËRĀRǞRĴ260;Ņstrcpy()
本身也不会创建任何地址。在使用strcpy()
时,它显示了试图读取或写入受保护内存的评估冲突错误。这通常表示其他内存已损坏。
似乎strcpy每次更改时都会创建新地址String=original,address=19193192 String=modified original1,address=3236388
感谢您的响应@Sourav Ghosh,但如果我使用strcpy()或strdup(),这将创建新地址。我希望我的char*类型为realloc大小和值,地址相同。可能吗?因为我发现char*address即使在@VËVËRĀRǞRĴ260;Ņstrcpy()
本身也不会创建任何地址。在使用strcpy()
时,它显示了试图读取或写入受保护内存的评估冲突错误。这通常表示其他内存已损坏。
似乎每次更改时都需要创建新地址String=original,address=19193192 String=modified original1,address=3236388