我知道這已經回答過,但我找不到問題。
這兩個是initialisations之間的差異:這兩個指針與char初始化之間的區別
int main()
{
char* pch1;
char* pch2;
pch1 = (char*)malloc(sizeof(char) * 5);
strcpy(pch1, "Text");
pch2 = "Text";
}
我知道這已經回答過,但我找不到問題。
這兩個是initialisations之間的差異:這兩個指針與char初始化之間的區別
int main()
{
char* pch1;
char* pch2;
pch1 = (char*)malloc(sizeof(char) * 5);
strcpy(pch1, "Text");
pch2 = "Text";
}
第一:不要施放re從malloc
轉換值 - 這是一個常見的錯誤來源。 Do I cast the result of malloc?
pch1 = malloc(sizeof(char) * 5);
一個指針分配給對堆5個字節的動態分配的塊。
pch2 = "Text";
理想情況下應該避免,因爲它將指針指向字符串文字。字符串文字在大多數操作系統中是隻讀的,也是錯誤的常見來源。如果你這樣做你應該做的指針const
const char * pch2 = "Text";
這裏有三個主要的差別:一個字符串到動態內存
pch1
字符串是合法的;修改pch2
字符串是非法的pch1
以避免內存泄漏。爲了完整起見,考慮pch3
這是這樣的初始化:
char tmp[] = "Text";
char *pch3 = tmp;
這pch3
是可以修改的像你pch1
,但它並不需要釋放,因爲字符串的內容複製到自動記憶。
嗯,這就是它。謝謝。 – Kobe
pch1
點堆
可以bounderies
再加上你內修改已經釋放它
其他點的靜態數據段 你不能修改它
一個點堆內存,其他到prgoram的靜態數據段 – StoryTeller