2015-01-01 2 views
0

У меня есть некоторые проблемы при использовании strcpy для копирования массива строки внутри двойного указателя с выделенной памятью, но я не могу понять, почему я получаю ошибку сегментации, даже если я ранее выделил память. Вот код:Ошибка сегментации с использованием strcpy

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

typedef struct Students { 
    int q_exams; 
    char **done_exams; 


}Students; 


int main() { 

Students a; 
int i; 
char support[30]; 

printf("how many exams have you done ?\n"); 
scanf("%d",&(a.q_exams)); 
a.done_exams=malloc(sizeof(char*)*a.q_exams); 
if(a.done_exams==NULL) 
    { 
    printf("out of memory\n"); 
    return 0; 
    } 
for(i=0;i<a.q_exams;i++) 
    { 
    printf("Insert the name of the exam\n"); 
    scanf("%28s",support); 
    a.done_exams[i]=malloc(strlen(support)+1); 
    if(a.done_exams[i]==NULL) 
    { 
     printf("out of memory\n"); 
     return 0; 
    } 
    strcpy(a.done_exams[i][0],support); 
    fflush(stdin); 
    } 

    return 0; 
} 
+1

Почему вы делаете это 'scanf («% 48s », поддержка);' char support [30] '? –

+0

извините промах;) – Luca

ответ

0

strcpy(a.done_exams[i][0],support); 

должен быть

strcpy(a.done_exams[i],support); 

или

strcpy(&a.done_exams[i][0],support); 

Мой совет будет всегда использовать при компиляции предупреждений компилятора включен , Мой компилятор (gcc) делает очень хорошую работу по ловле проблемы и сказать вам точно, что должно быть сделано, чтобы исправить это:

test.c:37:12: warning: incompatible integer to pointer conversion passing 'char' to 
       parameter of type 'char *'; take the address with & [-Wint-conversion] 
    strcpy(a.done_exams[i][0],support); 
      ^~~~~~~~~~~~~~~~~~ 
      & 

P.S. Вы также отсутствуют некоторые #include S:

#include <stdlib.h> 
#include <string.h> 
+0

но почему это не то же самое, что a.done_exams [i] [0]? – Luca

+0

@Luca: Один из них - адрес 'done_exams [i] [0]', другой - его значение. – NPE

1

Вам нужно пройти адрес начального символа в strcpy, либо, как это

strcpy(&a.done_exams[i][0],support); 
// ^
// Add an ampersand 

или что то же самое, как это:

strcpy(a.done_exams[i] , support); 
//     ^
// Remove the second index 

В настоящий момент ваш код передает значение* начального символа, а не его адрес.

* Значение также не определено в то время, но это не основная причина, потому что вы не должны передавать значение вообще.

0

Просмотреть страницу пользователя strcpy().

Первый аргумент должен быть типа char *.

В соответствии с вашим кодом аргумент [a.done_exams[i][0]] имеет тип char. Вам необходимо передать char * [начальный адрес пункта назначения].

Изменить код

strcpy(a.done_exams[i],support); 
0

Этот код фиксируется

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

typedef struct Students { 
    int q_exams; 
    char **done_exams; 
} Students; 


int main() 
{ 
    Students a; 
    int i; 
    char support[49]; 

    printf("how many exams have you done ?\n"); 
    scanf("%d",&(a.q_exams)); 

    a.done_exams = malloc(sizeof(char*) * a.q_exams); 
    if(a.done_exams==NULL) 
    { 
     printf("out of memory\n"); 
     return 0; 
    } 

    for(i = 0 ; i < a.q_exams ; i++) 
    { 
     printf("Insert the name of the exam\n"); 
     scanf("%48s",support); 

     a.done_exams[i] = malloc(strlen(support)+1); 
     if(a.done_exams[i] == NULL) 
     { 
      printf("out of memory\n"); 
      return 0; 
     } 
     strcpy(a.done_exams[i]/*[0]*/, support); 
     /* ^    ^- this is wrong 
     *  + pass the address to the array not the first element value 
     * 
     * if you had warnings turned on you would have seen this 
     */ 
     fflush(stdin); 
    } 

    return 0; 
} 

обратите внимание, что

scanf("%48s", support); 

требует

char support[49]; 

, который также исправлен в коде.

Смежные вопросы