2016-04-14 60 views
1

我要进入字符串,但它一直在返回段故障双指针指向字符串采取导致段故障

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char **arr; 
    arr= (char**) malloc (5); 

    for(int i =0 ; i<5 ; i++) 
    { 
     arr[i]=(char *)malloc(10); 
    } 

    for(int i=0 ; i<5 ;i++) 
    { 
     char ch[10]; 
     printf("%d",i); 
     scanf("%s",ch); 
     strcpy(arr[i],ch); 
    } 


    for(int i=0 ; i<5 ;i++) 
    { 
     printf("%s ",arr[i]); 
    } 

    for(int i=0;i<5;i++) 
     free (arr[i]); 
    free (arr); 
} 

而且代码块不给错误并运行它完美谁能告诉我为什么?

+6

您正在分配5个字节,但您需要'5 * sizeof(char *)'来存放5个指针。 – stark

+0

也不要投射malloc的输出。 – stark

+0

作为一般规则,你可以缩短为“不要投” – stark

回答

0

更换这段代码:

char **arr; 
arr= (char**) malloc (5); 

for(int i =0 ; i<5 ; i++) 
{ 
    arr[i]=(char *)malloc(10); 
} 

这样:

char **arr; 
arr = malloc (5*sizeof(char*)); 

for(int i = 0 ; i < 5 ; i++) 
{ 
    arr[i] = malloc(10); 
} 

错在你的代码是,该声明

arr= (char**) malloc (5); 

相当于为

arr= (char**) malloc (5 * sizeof(char)); 

,这意味着,对于5个字符分配大小。 你需要做的是分配空间5 指针字符arr,这就是为什么你应该使用sizeof(char*)

你也可以看看this link,以便更好地理解分配双指针时在内存中发生了什么。关于这些线

0

for(int i=0 ; i<5 ;i++) 
{ 
    char ch[10]; 
    printf("%d",i); 
    scanf("%s",ch); 
    strcpy(arr[i],ch); 
} 
当用户进入多于9个字符

,输入缓冲器将被溢出。

推荐:

for(int i=0 ; i<5 ;i++) 
{ 
    char ch[10]; 
    printf("%d",i); 
    scanf("%9s",ch); <-- notice the change 
    strcpy(arr[i],ch); 
} 

然而,那么他们可能被遗留在标准输入字符,应食用任何尾随空白需要被消耗。建议:

for(int i=0 ; i<5 ;i++) 
{ 
    char ch[10]; 
    printf("%d",i); 
    scanf(" %9s",ch); <-- notice the '9', notice the space 
    strcpy(arr[i],ch); 
    int trash; 
    while((trash = getchar()) != EOF && '\n' != trash); 
}