我非常新的C所以也許有人可以闡明爲什麼我收到這個程序分段錯誤一些輕:字符指針造成分段錯誤
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *username = "hello";
char *other;
*other = *username;
return 0;
}
這是爲什麼呢賽格斷層?
我非常新的C所以也許有人可以闡明爲什麼我收到這個程序分段錯誤一些輕:字符指針造成分段錯誤
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *username = "hello";
char *other;
*other = *username;
return 0;
}
這是爲什麼呢賽格斷層?
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;
"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");
也許你想要做的'其他=用戶名;',所以他們指向同一個地方?要麼,要麼你必須爲'other'分配內存並使用'strcpy'。這取決於你想達到什麼。 – AntonH
分配在哪裏? –
'other'未初始化。 – BLUEPIXY