2014-10-04 173 views
0

當我們使用二維字符數組時,我們可以自由地初始化我們聲明數組的字符串,或者使用scanf()函數接收字符串。但是當我們使用一個指針數組,我們無法使用scanf()從鍵盤接收字符串。爲什麼?指向字符串的指針陣列

#include<stdio.h> 

int main() 
{ 
char *names[6]; 
int i; 
for(i=0;i<=5;i++) 
{ 

    printf("Enter name:"); 
    scanf("%s",names[i]); 

} 
return 0; 
+2

因爲這些指針並不指向您可以寫入的任何位置? – juanchopanza 2014-10-04 08:54:18

+1

另外這是*不是*二維數組的字符。查找有關C中指針和數組之間差異的基礎知識。 – 2014-10-04 09:17:43

回答

3
char *names[6]; 

聲明names作爲指針數組以char但對於names元件不分配存儲器。在寫入之前,您需要爲每個元素分配內存,否則會調用未定義的行爲

試試這個:

for(i = 0; i <= 5; i++) 
{ 
    printf("Enter name:"); 
    names[i] = malloc(SIZE); // SIZE is for length of string 
    if(names[i] != NULL) 
     scanf("%s", names[i]); 
} 
+2

@Down Voter;評論將不勝感激。 – haccks 2014-10-04 09:06:47

+0

不是downvoter,但可能是因爲使用'gets'(拼寫稍有不同),或者未能檢查'malloc'的返回值 – 2014-10-04 10:49:49

4

您的代碼不工作,因爲它通過將字符串存儲到未初始化爲指向任何指針調用未定義的行爲。您需要使用malloc()

valgrind是一個工具,它會自動捕獲這類程序。

2

scanf不會自動分配內存,因此您必須在調用scanf之前分配一個用於存儲輸入的緩衝區。

#include<stdio.h> 

int main() 
{ 
char *names[6]; 
int i; 
for(i=0;i<=5;i++) 
{ 
printf("Enter name:"); 
names[i]=(char *)malloc(256); // 256 is size of buffer 
scanf("%s",names[i]); 

} 
return 0;