2014-10-04 137 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;