2016-04-14 2 views
1

Я хочу, чтобы ввести строку, но он постоянно возвращается FAULT сегментДвойной Указатель принимать строки вызывает ошибку сегмента

#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

Как правило, вы можете сократить это до «Do not cast» – 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 указатели на char для 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); 
} 
Смежные вопросы