2014-02-20 39 views
0

我知道這已經回答過,但我找不到問題。
這兩個是initialisations之間的差異:這兩個指針與char初始化之間的區別

int main() 
{ 
    char* pch1; 
    char* pch2; 

    pch1 = (char*)malloc(sizeof(char) * 5); 
    strcpy(pch1, "Text"); 

    pch2 = "Text"; 
} 
+1

一個點堆內存,其他到prgoram的靜態數據段 – StoryTeller

回答

2

第一:不要施放re從malloc轉換值 - 這是一個常見的錯誤來源。 Do I cast the result of malloc?

pch1 = malloc(sizeof(char) * 5); 

一個指針分配給對堆5個字節的動態分配的塊。

pch2 = "Text"; 

理想情況下應該避免,因爲它將指針指向字符串文字。字符串文字在大多數操作系統中是隻讀的,也是錯誤的常見來源。如果你這樣做你應該做的指針const

const char * pch2 = "Text"; 
+0

我在C中沒有編寫太多的代碼,但是在任何地方我都看到從malloc返回的值被施放。你能告訴我爲什麼這是錯的嗎? – Kobe

+0

@vBx可能你在C++ c中看到的混音代碼 – qwr

+1

在C++中你必須投射,在C中你不應該。在這裏詳細解釋:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

2

這裏有三個主要的差別:一個字符串到動態內存

  • 第一個副本的內容,而第二個點到直接的文字。
  • 修改pch1字符串是合法的;修改pch2字符串是非法的
  • 您需要釋放pch1以避免內存泄漏。

爲了完整起見,考慮pch3這是這樣的初始化:

char tmp[] = "Text"; 
char *pch3 = tmp; 

pch3是可以修改的像你pch1,但它並不需要釋放,因爲字符串的內容複製到自動記憶。

+0

嗯,這就是它。謝謝。 – Kobe

1

pch1點堆

可以bounderies

再加上你內修改已經釋放它

其他點的靜態數據段 你不能修改它

0
  1. PCH1將使用堆內存用於存儲你的數據
  2. PCH 2 - 使用堆棧內存