2017-04-07 70 views
0

我是C編程新手, 我有一個帶有char和int指針的結構,我經常修改這個指針,found some reference in online to realloc char *和它的工作正常,但是當我用在裏面的時候同樣的事情結構意味着出現問題,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

這不是C. C沒有'new'作爲關鍵字。 –

+4

爲什麼你將C和C++混合? 'new'和'malloc'?堅持一個.. – Arash

+0

[The C++ FAQ](https://isocpp.org/wiki/faq/freestore-mgmt#mixing-malloc-and-delete) – Lundin

回答

3

這裏的問題是,分配內存

myStructPtr->strPtr = (char *)malloc(sizeof("original")); 

後你覆蓋返回的指針

myStructPtr->strPtr = "original"; 

然後,您嘗試在一個指針,它是使用realloc()不是由內存分配器函數返回的。這導致undefined behavior

引用C11,章§7.22.3.5

如果ptr是一個空指針,該realloc函數的行爲類似於malloc函數爲 指定的大小。否則,如果ptr不匹配的內存 管理功能早些時候返回一個指針,或者如果空間已釋放被調用freerealloc功能,的行爲是不確定的。 [...]

這就是說,你不應該使用%u打印指針本身,youust使用%p格式指示符和投德相應參數(void *)

解決方案您應該

  • 的malloc()後,使用strcpy()的內容複製到分配的內存區域,指向返回的指針從malloc()電話。
  • 擺脫malloc()並使用非標準strdup()
+0

感謝回覆@Sourav Ghosh,但是如果我使用strcpy()或strdup()這將創建新地址。我想我的char *類型重新分配大小和值相同的地址。可能嗎?因爲我發現char *地址在使用https://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm中的realloc後仍然可以保持相同的地址 –

+0

@ǨVĔŊǞĴĄŅ'strcpy()'never_creates_任何地址,本身。 –

+0

使用'strcpy()'時顯示評估違規錯誤'試圖讀取或寫入受保護的內存。這通常表示其他內存已損壞。' –

2

malloc分配內存並將地址存儲在myStructPtr-> strPtr中。然後,您將指針重新分配給字符串常量「original」的位置。

您不能重新分配字符串consant的位置。

不應將原始文件分配給指針,而應將其複製到指針指向的位置。

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