2014-08-30 47 views
-3

我在C(malloc)和C++(新)下面的代碼。我很困惑爲什麼C版本不工作。 錯誤 - 內存分配慘敗前塊在malloc和新的堆初始化混亂

Exited: ExitFailure 127.

是否有這樣做的任何問題。

C++版

#include <iostream> 

using namespace std; 

int main() 
{ 
    char *p=new char[20]; 
    strcpy(p,"Hello"); 
    p=(char*)"Hi"; 
    cout<<p; 
    delete p; 
} 

C版

#include <stdio.h> 
# include <malloc.h> 
# include <string.h> 

int main() 
{ 
    char *p=(char*)malloc(50); 
    strcpy(p,"Hello"); 
    p=(char *)"Hi"; 
    printf("%s",p); 
    free(p); 
} 
+3

兩者是不正確的。你必須施加「嗨」的事實應該是線索。 – 2014-08-30 16:47:56

+2

這兩個版本都不正確。 'p =(char *)「Hi」;'使'delete'或'free()'的行爲未定義。 – 2014-08-30 16:48:34

+2

還要注意,在delete中使用'new []'是未定義的行爲,所以即使你修復了指針重新分配,它仍然是錯誤的代碼。 – chris 2014-08-30 16:53:05

回答

1

根據實施細節,mallocnew通常分配更大的存儲器段比請求。它們中的每一個在該額外的存儲器片段中存儲對應的freedelete所需的信息,然後在片段之後向用戶返回指向的存儲器的指針。

freedelete是所謂的,他們中的每一個預計之前找到所需的信息用戶請求解除分配內存的地址。如果該信息被破壞(或者在您的示例中 - 完全無效),則會調用未定義的行爲,並且此時可能發生任何事情。

1
char *p=(char*)malloc(50); // you allocate p 
strcpy(p,"Hello");  // you change the p's value in legal way 
         // here should be free(p) 
p=(char *)"Hi";   // YOU OVERWRITE p, YOU CAN'T FREE IT AFTER THAT LINE 
printf("%s",p);  // 
free(p);    // this line should be removed 

另外:

char *p=new char[20]; 
strcpy(p,"Hello"); 
/*here should be delete[] p, not delete p, it deletes only 1 element 
*you allocated 20 
*/ 
p=(char*)"Hi"; 
cout<<p; 
delete p; //this line should be removed 
+0

我認爲你是向OP解釋他或她已經知道的。這個問題意味着OP知道它是錯誤的並且不應該工作,但是然後OP詢問「C行爲」與「C++行爲」有什麼不同。 – 2014-08-30 19:52:03