2014-05-01 97 views
-1

我非常新的C所以也許有人可以闡明爲什麼我收到這個程序分段錯誤一些輕:字符指針造成分段錯誤

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char *username = "hello"; 
    char *other; 
    *other = *username; 

    return 0; 
} 

這是爲什麼呢賽格斷層?

+0

也許你想要做的'其他=用戶名;',所以他們指向同一個地方?要麼,要麼你必須爲'other'分配內存並使用'strcpy'。這取決於你想達到什麼。 – AntonH

+0

分配在哪裏? –

+1

'other'未初始化。 – BLUEPIXY

回答

3

other尚未初始化。它指向記憶中的某個隨機點,並且你在那裏粘着一個角色。

你想要麼分配一些空間other

char *other = malloc(6); // or 1, or however much space you'll eventually need 
*other = *username; 
// first char at `other` is now 'h'; the rest is unknown. To make it valid string, 
// add a trailing '\0' 
other[1] = '\0'; 

,或者如果你正在嘗試做一個重複的字符串:

char *other = strdup(username); 

,或者如果你想使other指向同一個地方username

char *other = username; 
0
"Okay as I understand it char *username = "hello"; 
automatically allocates a place for the string." 

它可能有助於更好地定義單詞'it'(如上面的句子中所用);這是'編譯器'(沒有深入討論鏈接器和加載器)。這意味着編譯器在執行程序之前爲靜態字符串「hello」準備一個位置。例如,您可以'grep'可執行文件並發現可執行文件包含字符串'hello'。

隨着程序被OS加載到內存中,會在程序可以動態分配內存的地方建立「堆」。

靜態字符串「hello」不是堆的一部分;並沒有在運行時動態分配。相反,它是在編譯時靜態分配的。

靜態值(例如字符串「hello」)不能由'realloc()'調整大小,或由'free()'釋放,因爲這些函數僅適用於從「堆」分配的項目,而非靜態「編譯時」分配。


以下代碼聲明瞭一個靜態字符串「hello」。 它還聲明瞭一個字符指針「username」,並初始化指針指向靜態字符串。

char *username = "hello"; 

以下代碼聲明瞭一個字符指針'other',並使其未初始化。作爲'其他'是未初始化的,並且指針總是指向某處;未初始化的「其他」指針可能指向隨機內存位置(實際上不存在)。

char *other; 

下面的行試圖一個字符(「H」)從其中username指向複製,到「其他」是指向(一個隨機存儲器位置,它實際上並不存在)。

*other = *username; 

這就是生成'分段錯誤'的原因。


僅供參考,下面的語句將導致指針「用戶名」和「其他」指向同一個地方,靜態字符串「hello」:

char *other; 
other = username; 

...這是相同:

char *other = username; 

如果你願意的話,可能會導致「你好」從堆中分配(在運行時),如下所示:

char *username = strdup("hello"); 

如果你想在「其他」的另一個副本:

char *other = strdup("hello");