2014-12-01 3 views
-1

в соответствии с DDD. Я получаю seg-ошибку от strcpy, но я не могу понять, что я делаю неправильно (все еще совершенно новый для C). Любая помощь была бы весьма признательна, заблаговременно.strcpy Seg Fault

int compare_people(PERSON* first, PERSON* second) 
{ 
    char firstName[32]; 
    char secondName[32]; 

    strcpy(firstName, first->name); 
    strcpy(secondName, second->name); 

    int returnVal = strcmp(firstName, secondName); 

    return returnVal; 
} 
+2

Если какое-либо имя длиннее 31 символов, он будет писать недействительных памяти, так как буферы вы сделали только что большой. – mukunda

+0

Имена в среднем всего 5-10 символов – Sammdahamm

+2

Я бы предположил, что 'first' или' second' '' NULL'. Используйте отладчик. –

ответ

2

Кажется, что первое или второе равен NULL или первого> имя или второго> имя равно NULL или имеет ненулевой законченные данные, которые за счет использования STRCPY превышает 32 символов. Другой причиной может быть то, что имя first-> name или second-> имеет недопустимый указатель, например, указатель на локальные данные, которые уже уничтожены.

Вставьте проверку в функцию. Например,

assert(first != NULL && second != NULL && 
     first->name != NULL && second->name != NULL && 
     strlen(first->name) < 32 && strlen(second->name) < 32); 

Или вы можете разделить это утверждение на несколько отдельных утверждений.

+0

Что относительно нулевых данных длиной 32? – Deduplicator

+0

@Deduplicator Например, first-> data является указателем на динамически распределенные данные размером 32 символа, но содержит ненулевые завершенные данные. –

0
just try that code. 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    typedef struct{ 

    char name[25]; 
    }PERSON; 

    int compare_people(PERSON* first, PERSON* second); 
    main() 
    { 
    PERSON *first,*second; 
    first=(PERSON *)malloc(sizeof(PERSON)); 
    printf("Enter the first name\n"); 
    scanf("%s",first->name); 
    second=(PERSON *)malloc(sizeof(PERSON)); 
    printf("Enter the second name\n"); 
    scanf("%s",second->name); 

    if((compare_people(first,second)) == 0) 
     printf("Two names are same \n"); 
    else 
     printf("Two names are different\n"); 


    } 

    int compare_people(PERSON* first, PERSON* second) 
    { 
    char firstName[32]; 
    char secondName[32]; 

    strcpy(firstName, first->name); 
    strcpy(secondName, second->name); 

    int returnVal = strcmp(firstName, secondName); 
    return returnVal 

    } 

~