в чем причина ошибки strcpy - PullRequest
       37

в чем причина ошибки strcpy

1 голос
/ 02 декабря 2011

Когда я пытаюсь выполнить эту программу, я получаю ошибку сегментации. В чем может быть причина?

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

    #define UWT unsigned int 
    #define DIR_LEN 1024
    typedef struct fileParsedData{
            UWT weight;
            char *dir;
    }FILEPARSEDATA;

    int parseData(char *fileData,FILEPARSEDATA *fPD){

            char tmpStr[DIR_LEN] = {0};

            strcpy(tmpStr,strchr(fileData,' ') + 1);
            *(strchr(tmpStr,'\n')) = '\0';
            fPD->weight = atoi(fileData);

            if((fPD->dir = (char *)malloc(strlen(tmpStr) + 1)) != NULL ){
                    memset(&fPD->dir,0,strlen(tmpStr)+1);
                    strcpy(fPD->dir,tmpStr);
                    return 0;
            }
            return -1;
    }

    int main(){
            char fileData[10] = " hai\n";
            FILEPARSEDATA fPD;
            memset(&fPD,0,sizeof(FILEPARSEDATA));
            parseData(fileData,&fPD);
            return 0;
    }

1 Ответ

4 голосов
/ 02 декабря 2011

Проблема здесь:

memset(&fPD->dir,0,strlen(tmpStr)+1);

Приведенная выше строка должна гласить:

memset(fPD->dir,0,strlen(tmpStr)+1);

В противном случае вы не только обнуляете указатель fPD->dir , вы также повреждаете память сразу после нее. Как только вы обнулите указатель, последующие strcpy() в указанных ошибках памяти.

Фактически, вся эта строка memset() выглядит избыточной, поскольку сразу за ней следует strcpy().

...