2014-09-11 85 views
1

我敢肯定,在這裏只是一個愚蠢的錯誤,但是,我無法弄清楚。 這是我的代碼部分:scanf正在使用未初始化的變量; C

char *moving; 
scanf("%s", moving); 

當我用gcc編譯它,它說以下內容:

newmatrix.c:38:7: warning: ‘moving’ is used uninitialized in this function [-Wuninitialized] 

38號線是scanf函數

我該如何解決這個問題? 謝謝

+2

'moving'是一個指針。它指向什麼?沒有。這正是編譯器試圖告訴你的。 – 2014-09-11 04:31:33

回答

3

在使用之前爲moving分配內存。使用malloc()

movingchar類型的指針。在存儲字符串moving之前,您需要爲其分配內存。

char *moving; 
moving = malloc(100); 
scanf("%s", moving); 

OR

簡單地改變char *movingchar moving[256]

而不是scanf()使用fgets()

+0

更好地使用'scanf(「%99s」,移動);'但我會推薦'getline'(它與'scanf'不一樣,它停在空格上)。 – 2014-09-11 04:44:47

+0

感謝它的工作:D – 2014-09-11 04:46:20

1

使用它

char *moving; 
moving = malloc(100*sizeof(char)); 
scanf("%s", moving); 
+0

'sizeof(char)'的定義是1。爲什麼'malloc'?考慮到這個問題中的信息,'char moving [100];'也同樣適用。 – Praetorian 2014-09-11 04:36:26

+0

我給了malloc,因爲他似乎想要使用指針。 和sizeof(char)是1的定義,這就是爲什麼我給了100 * sizeof(char) – Haris 2014-09-11 04:38:27

+0

好吧,OP也被一個非常簡單的警告弄糊塗了,所以他似乎是一個初學者,他希望使用*不一定是他*應該使用的*。你寫了'100 * 1',因爲它比寫'100'更有表現力? – Praetorian 2014-09-11 04:43:21

5

打電話scanf()之前,您可以分配內存,然後分配內存的指針。例如:

char moving[256]; 
if (scanf("%255s", moving) != 1) 
    …oops — presumably EOF… 

你可以使用malloc(),而不是一個簡單的數組,但你必須記住釋放分配的內存。 OTOH,如果要從讀取函數中返回數據,使用malloc()可能會更方便,但考慮將指針指向該函數的空間(及其大小?)。

或者你也可以有scanf()做內存分配給你(檢查手冊頁scanf()仔細 - 每週閱讀,直到你記住(夠了)的話):

char *moving; 
if (scanf("%255ms", &moving) != 1) 
    …oops — probably EOF, but perhaps OOM (out of memory)… 
…use moving… 
free(moving); 

是的,這是在POSIX標準scanf()中的一個鮮爲人知的選項;它不是標準C的一部分。