当我尝试执行此程序时,我遇到了分段错误。可能是什么原因?
#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;
}
答案 0 :(得分:4)
问题在于:
memset(&fPD->dir,0,strlen(tmpStr)+1);
以上行应为:
memset(fPD->dir,0,strlen(tmpStr)+1);
否则,您不仅要将fPD->dir
指针归零,而且还会立即破坏内存。一旦你将指针归零,随后strcpy()
进入指向内存的段错误。
事实上,整个memset()
行似乎是多余的,因为它紧跟着strcpy()
。