2012-05-21 97 views
1
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    void *malloc(size_t size); 
    char *ptr, *retval; 
    ptr = (char *)calloc(10, sizeof(char)); 

    if (ptr == NULL) 
     printf("calloc failed\n"); 
    else 
     printf("calloc successful\n"); 

    retval = realloc(ptr, 5); 

    if (retval == NULL) 
     printf("realloc failed\n"); 
    else 
     printf("realloc successful\n"); 

    free(ptr); 
    free(retval); 
} 

這裏是我的代碼中的錯誤出現在第14行,它說轉換*爲char *

無效的轉換,從 「無效*」 到 「字符*」

+4

這不是C++,所以不要這樣標記它。 – Xeo

+0

你可以重新格式化它,讓它讀取更清潔? – octopusgrabbus

+0

@Xeo:如果它被編譯爲C,他不會得到這個問題......所以C++可能更適合... – Goz

回答

8

您可以像對待malloc一樣,將realloc的結果賦予(char *)。

retval = (char*)realloc(ptr, 5); 

具有諷刺意味的是,雖然你寫的是完全合法的「C」代碼......只是不需要C++你需要演員。所以你也可以嘗試設置你的編譯器將代碼編譯爲「C」,因爲你沒有使用任何C++並且同樣可以解決這個問題。也就是說上面的修改也是完全合法的C ...所以可以在C++和C下編譯。

編輯:由於softy正確地指出你realloc ptr並將指針位置存儲到retval,這意味着ptr可能,指向無效的內存,你不應該釋放它。最好你兩次釋放相同的內存,最壞的情況是你在已釋放的內存上調用free(通過realloc)。無論哪種方式是不好的(TM)。因爲你正在調用一些嚴重的「未定義的行爲」。

+1

好!!謝謝你的回答。無論如何,我已經做到了:)和關於標籤的遺憾,因爲這是我的第一個問題,所以我不知道如何使用EM;)謝謝反正;) –

+0

@ejazdogar:如果你點擊數字下方的小勾號然後你「接受」我的帖子;) – Goz

1

你不能釋放一個指針twice.Here的RETVAL和PTR都指向同一位置 添加此代碼之前免費電話查詢:

printf("%p \n ",ptr); 
printf("%p \n",retval); 

realloc的縮水德大小,但指針位置保持在相同。 您可以嘗試這個問題,以及:

if(ptr == retval) 

/* delete either ptr or retval - just for sake of this programm , Idealy you shouldnt free the the pointer like this as Rightly Suggested by **Goz** in C++/c*/ 

只是爲了讓它work.otherwise它編譯通過gcc的罰款,但如果你運行它會給一個骯髒的堆棧跟蹤你試圖釋放同一指針twice.the內存分配函數的底層中斷調用可能會或可能不會將相同的指針分配給它。如果擴展的大小可能是30或50,它可能會給你不同的指針。

RGDS, 多愁善感

+0

你有一個好點,但絕對不會重新分配你,永遠不會自由ptr ...它要麼指向與retval相同的位置,要麼已經被釋放! – Goz

+0

是的,它可能會或可能不會這就是爲什麼ptr等價檢查! – Raulp

+0

但如果他們不相等(或者即使他們是),那麼你不應該免費ptr ...所以等效性檢查是無關緊要的...在ptr上調用free是一個等待發生的錯誤... – Goz

0

如果你想它來編譯,用C編寫。它看起來好像你正在使用C++編譯。它是有效的C但不是有效的C++。在大多數使用小寫.c擴展名的編譯器中,編譯器會自動使用C編譯。 .cpp會導致C++編譯,而且.C(大寫)可能導致C++編譯(例如在gcc中)。

1

其他人已經注意到你的C代碼正在編譯爲C++代碼。 C中不需要強制轉換,但在C++中是必需的。在C++中,你應該使用矢量(或字符串)。

這裏是你的代碼的一些看法:

  1. 不要重複聲明的malloc。包括stdlib.h會爲你做到這一點。謝天謝地,你已經成功地複製了它的聲明,所以它只是多餘的(並且讓別人閱讀代碼時感到困惑)。如果你的聲明錯誤,你有未定義的行爲。

  2. 如果realloc成功,則不要釋放'ptr'。

  3. 有些人可能會指出,在一些深奧的系統中,calloc可能不會做你期望的(專門用於指針和浮點類型)。考慮到你希望你的動態分配的空間被合適的值初始化,調用calloc比malloc多餘。