Realloc char *内部结构

时间:2017-04-07 07:32:29

标签: c++ c pointers realloc

我是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中的错误。

2 个答案:

答案 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>

解决方案您应该

  • 在malloc()之后,使用strcpy()将内容复制到分配的内存区域,由malloc()调用返回的指针指向。
  • 摆脱malloc()并使用非标准 strdup()

答案 1 :(得分:2)

malloc分配内存并将地址存储在myStructPtr-&gt; strPtr中。然后将指针重新指定为字符串常量“original”的位置。

您无法重新分配字符串consant的位置。

不是将原始内容分配给指针,而应将其复制到指针所指向的位置。

const char* originalStr = "original";
memcpy ( myStructPtr->strPtr, originalStr , strlen(originalStr)+1 );