2014-01-21 145 views
0

我的C程序中出現了段錯誤,我不知道爲什麼。它在打印出「調試6」後出現故障,然後出現「段錯誤(11)。我有一個預感,這是因爲我的str_split_2函數。該程序應該讀取文件,第一行有n,然後n行有兩行值 「A,b」。我想的值保存至2維陣列的地圖。分割錯誤(11)

char** str_split_2(char* str, const char delim) 
{ 
    char** result; 
    result=(char**)malloc(2*sizeof(char*)); 
    result[0] = strtok(str, &delim); 
    result[1] = strtok(NULL, &delim); 
    return result; 
} 


int loadFile(int*** map, char* filename,int *n) 
{ 
    int i=0; 
    char *line = NULL; 
    size_t len; 
    FILE *fptr = fopen(filename, "r"); 
    if(fptr == NULL) 
    { 
     fprintf(stderr, "Error opening a file: %s\n", filename); 
     return 1; 
    } 

    getline(&line, &len, fptr); 
    *n = atoi(line); 
    printf("n: %d\n",*n); 
    *map = (int**) malloc((*n)*sizeof(int*)); 
    if(*map==NULL) 
     return 1; 
    char** sPosition=NULL; 
    printf("debug 0\n"); 
    for(i=0; i<*n; i++) 
    { 
     *map[i]=(int*) malloc(2*sizeof(int)); 
     printf("debut 1\n"); 
     if(*map[i]==NULL) 
      return 1; 
     printf("debug 2\n"); 
     getline(&line, &len, fptr); 
     sPosition=str_split_2(line,','); 
     printf("debug 3\n"); 
     printf("%s\n%s\n",sPosition[0],sPosition[1]); 
     printf("debug 4\n"); 
     *map[i][0]=atoi(sPosition[0]); 
     printf("debug 5 %d\n",*map[i][0]); 
     *map[i][1]=atoi(sPosition[1]); 
     printf("debug 6 %d\n",*map[i][1]); 
     printf("hello"); 
     printf("%d:",i); 
    } 

fclose(fptr); 
free(line); 
return 0; 
} 

回答

2

我認爲

*map[i]=(int*) malloc(2*sizeof(int)); 

應該是

(*map)[i]=(int*) malloc(2*sizeof(int)); 
map[0][i]=(int*) malloc(2*sizeof(int)); 

ELS一個e這將意味着

*(map[i])=(int*) malloc(2*sizeof(int)); 

這似乎是錯誤的。當然,同樣的問題是在傳遞到strtok

*map[i][0]=atoi(sPosition[0]); 
    printf("debug 5 %d\n",*map[i][0]); 
    *map[i][1]=atoi(sPosition[1]); 
    printf("debug 6 %d\n",*map[i][1]); 
+0

謝謝。這正是那種錯誤,人們不會注意到它對編譯器應該是顯而易見的。 – Xyzk

0

第二個參數必須是指向一個空終止字符串(即,字符串必須以0字符結束)。

您正在傳遞指向字符變量(char delim)的指針,並且strtok會從該地址「掃描」內存,直到遇到0值,因此很可能會在某個點執行非法內存訪問。

順便說一句,這是與所有str例程的情況下,如strcpystrlenstrcmp