分割的錯,我已經聲明一個變量作爲與scanf函數用於爲const char *
const char* mode;
我想要得到的mode
從用戶的值。當我使用
scanf("%s",mode)
我得到一個分段錯誤。有什麼建議麼?
分割的錯,我已經聲明一個變量作爲與scanf函數用於爲const char *
const char* mode;
我想要得到的mode
從用戶的值。當我使用
scanf("%s",mode)
我得到一個分段錯誤。有什麼建議麼?
您需要爲指針分配內存才能對其執行一些有意義的操作。聲明爲:
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
而且,最好是有堆棧分配,如果需要,該內存是不是太大: 簡單,
char mode[MAX_LENGTH];
分割故障一般是訪問內存的嘗試CPU無法物理地址。
這是因爲你沒有爲你的變量分配內存。
注意:
但是像Turbo C++這樣的一些c編譯器允許你在沒有分配內存的情況下這樣做。
即使Turbo C代碼在未初始化的指針中也會遇到麻煩,儘管在x86 *實模式中*不會導致段錯誤:某些隨機內存已損壞。 – wallyk
您應該已撥打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
指向一個緩衝區這是合理的大,而且避免提供很長的輸入)
+1:爲了抽出時間回答並詳細解釋,而不是像我一樣給出答案。 –
嗨ALS,但我需要使用const char *,因爲我將這個變量傳遞給一個函數。我不能只用char *在這裏。 – Blackforest
你應該可以將'char *'傳遞給任何需要'const char *'的東西,反之則不然。 –
謝謝Als。這樣可行! – Blackforest