C++ Realloc 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

我是C编程新手, 我有一个带有char和int指针的结构,我经常修改这个指针,char*和它的工作很好,但当我使用内部结构时,同样的事情意味着问题出现了

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()之后,用于将内容复制到分配的内存区域,该区域由
    malloc()
    call返回的指针指向
  • 摆脱malloc()并使用非标准的

    • 这里的问题是,在分配内存之后

       myStructPtr->strPtr = (char *)malloc(sizeof("original"));
      
      您正在覆盖返回的指针

      myStructPtr->strPtr = "original";
      
      然后,尝试对内存分配器函数未返回的指针使用
      realloc()
      。这导致了

      引用章节§7.22.3.5中的
      C11

      如果
      ptr
      是空指针,则
      realloc
      函数的行为类似于 指定的大小。否则,如果
      ptr
      与内存先前返回的指针不匹配 管理功能
      ,或者如果通过调用
      空闲
      释放空间,或者
      realloc
      函数,行为未定义。[…]

      也就是说,您不应该使用
      %u
      打印指针本身,您必须使用
      %p
      格式说明符并将相应的参数强制转换为
      (void*)

      解决方案您应该

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

      malloc分配内存并将地址存储在mystructtptr->strPtr中。然后重新设计指向字符串常量“original”位置的指针

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

      您应该将其复制到指针所指向的位置,而不是将原始文件指定给指针

      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