2012-05-17 66 views

回答

2

您需要爲指針分配內存才能對其執行一些有意義的操作。聲明爲:

#define MAX_LENGTH 256 
char *mode = malloc(MAX_LENGTH); 

而且,最好是有堆棧分配,如果需要,該內存是不是太大: 簡單,

char mode[MAX_LENGTH]; 
+0

嗨ALS,但我需要使用const char *,因爲我將這個變量傳遞給一個函數。我不能只用char *在這裏。 – Blackforest

+2

你應該可以將'char *'傳遞給任何需要'const char *'的東西,反之則不然。 –

+0

謝謝Als。這樣可行! – Blackforest

2

分割故障一般是訪問內存的嘗試CPU無法物理地址。

這是因爲你沒有爲你的變量分配內存。
注意:
但是像Turbo C++這樣的一些c編譯器允許你在沒有分配內存的情況下這樣做。

+0

即使Turbo C代碼在未初始化的指針中也會遇到麻煩,儘管在x86 *實模式中*不會導致段錯誤:某些隨機內存已損壞。 – wallyk

4

應該已撥打scanf電話的警告。

通過聲明

const char* mode; 

你讓mode一個指針爲const char,這意味着你無法將數據修改mode點。

然後調用:

scanf("%s",mode); 

其試圖將數據修改mode點。

GCC警告一下:

warning: writing into constant object (argument 2) [-Wformat] 

所以mode需要是指向非const字符。而且,正如其他人所提到的,它需要指向一些實際數據,以便scanf可以修改該數據。這可能是你的分段錯誤,但由於你沒有向我們展示mode是如何初始化的,所以很難說清楚。

mode通常會指向數組的第一個字符。那麼這個數組有多大?由於您使用的scanf格式爲"%s",因此它不可能足夠大。 scanf("%s", mode)stdin讀取一個空白分隔的字符串到mode指向的緩衝區中。您無法避免會使緩衝區溢出的輸入。

(如果這是一個初學者的練習,你也許可以忽略緩衝區溢出問題現在;只是讓mode指向一個緩衝區這是合理的大,而且避免提供很長的輸入)

+0

+1:爲了抽出時間回答並詳細解釋,而不是像我一樣給出答案。 –