我是C编程新手, 我有一个带有char和int指针的结构,我常常经常修改这个指针,found some reference in online to realloc char *并且它的工作正常,但是当我使用内部结构意味着问题出现时同样的事情,
typedef struct MyStruct
{
int* intPtr;
char* strPtr;
} Mystruct;
在main()
Mystruct *myStructPtr;
myStructPtr = new Mystruct();
myStructPtr->intPtr = new int();
*myStructPtr->intPtr = 10;
myStructPtr->strPtr = (char *)malloc(sizeof("original"));
myStructPtr->strPtr = "original";
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr);
myStructPtr->strPtr = (char *)realloc(myStructPtr->strPtr, sizeof("modified original"));
myStructPtr->strPtr = "modified original";
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr);
我在指针内重新分配char *时发现了以下错误
这可能是由于堆的损坏,这表明它已加载的任何DLL中的错误。
答案 0 :(得分:3)
这里的问题是,在分配内存
之后 myStructPtr->strPtr = (char *)malloc(sizeof("original"));
你覆盖返回的指针
myStructPtr->strPtr = "original";
然后,您尝试在内存分配器函数未返回的指针上使用realloc()
。这会导致undefined behavior。
引用C11
,章节§7.22.3.5
如果
ptr
是空指针,则realloc
函数的行为类似于malloc
函数 指定大小。否则,如果ptr
与先前由内存返回的指针不匹配 管理功能,或者如果通过调用free
或已释放空间realloc
函数,行为未定义。 [....]
也就是说,你永远不应该使用%u
打印指针本身,你可以使用%p
格式说明符并将相应的参数强制转换为(void *)
。< / p>
解决方案您应该
答案 1 :(得分:2)
malloc分配内存并将地址存储在myStructPtr-&gt; strPtr中。然后将指针重新指定为字符串常量“original”的位置。
您无法重新分配字符串consant的位置。
不是将原始内容分配给指针,而应将其复制到指针所指向的位置。
const char* originalStr = "original";
memcpy ( myStructPtr->strPtr, originalStr , strlen(originalStr)+1 );