이전에 strdup()을 사용했습니다. 여기에서 사용하는 것과 같습니다. token2를 strdup에 전달합니다.이 strdup는 유효한 포인터가있는 char * 유형이며, "name = strdup (token2);"줄을 실행하려고 할 때 사용됩니다. 내 프로그램 segfaults 그리고 나는 확실히 확신 할 수 없다. 누구든지 나를 도울 수 있다면 크게 감사하겠습니다. 나는 또한 내 코드가 적절한 타입을 반환하지 않는다는 것을 알고있다. 나는 아직도 그것을 작성하는 중이다.strdup를 사용하려고 할 때 C - segfault
struct YelpDataBST* create_business_bst(const char* businesses_path, const char* reviews_path){
if(fopen(businesses_path,"r") == NULL || fopen(reviews_path,"r") == NULL)
return NULL;
FILE* fp_bp = fopen(businesses_path, "r");
FILE* fp_rp = fopen(reviews_path, "r");
struct YelpDataBST* yelp = malloc(sizeof(struct YelpDataBST*));
int ID = -1;
int tempID;
long int addressOffset;
long int reviewOffset;
char line[2000];
char line2[2000];
char temp[2000];
char temp2[2000];
char* token;
char* token2;
char* name;
int len;
BusList* busNode = NULL;
BusList* busList = NULL;
BusTree* busTreeNode = NULL;
BusTree* busTree = NULL;
ID = -1;
tempID = 0;
fgets(line,2000,fp_rp);
fgets(line2,2000,fp_bp);
fseek(fp_rp,0, SEEK_SET);
fseek(fp_bp,0,SEEK_SET);
int ct = 0;
while(!feof(fp_rp)){
len = strlen(line);
token = strtok(line, "\t");
//printf("line: %s\n", line);
token2 = strtok(line2, "\t");
tempID = atoi((char*)strdup(token));
if(ct == 0){
tempID = 1;
ct++;
}
if((ID != tempID || (ID < 0)) && tempID != 0){
if(tempID == 1)
tempID = 0;
token2 = strtok(NULL, "\t");
//name = strdup(token2);
reviewOffset = ftell(fp_rp);
if(tempID != 0)
reviewOffset -= len;
addressOffset = ftell(fp_bp);
ID = atoi((char*)strdup(token));
busList = BusNode_insert(busList, addressOffset, reviewOffset); //replace with create node for tree
token2 = strtok(NULL, "\t");
token2 = strtok(NULL, "\t");
token2 = strtok(NULL, "\t");
token2 = strtok(NULL, "\t");
token2 = strtok(NULL, "\t");
token2 = strtok(NULL, "\n");
fgets(line2,2000,fp_bp);
}
token = strtok(NULL, "\t");
token = strtok(NULL, "\t");
token = strtok(NULL, "\t");
token = strtok(NULL, "\t");
token = strtok(NULL, "\n");
fgets(line,2000,fp_rp);
}
//BusList_print(busList);
}
이 줄은 잘못된 수의 바이트를 할당합니다 :'struct YelpDataBST * yelp = malloc (sizeof (YelpDataBST *) 구조체), ' –
'tempID = atoi ((char *) strdup (token)); (strdup() 포인터가 사용되었지만 할당되지 않았습니다) – wildplasser
예, wildplasser가 말했듯이; 당신은 단지 'tempID = atoi (토큰);'만 필요합니다. (char *를 char *로 타입 변환 할 필요가 없습니다 ... –