2017-03-02 57 views
0

說實話,我不知道該寫什麼標題。我面臨的問題是,一旦我將內存分配給LinkedList結構中的char *行,它似乎在下一次迭代中縮小到26。我沒有寫完整的代碼(只有我認爲相關的部分)。 fileRead_runner是一個線程運行方法,它所做的就是搜索具有特定關鍵字的行並以鏈接列表的形式發送回父項。我打算用LinkedList結構中的char *行來做到這一點,但我面臨着一些神祕的問題。我已經給出了示例輸出。 「out:number」是字符串的實際大小,下一行的數字是程序存儲的長度。爲什麼內存不能正確地分配給C中的char *?

任何幫助將不勝感激! 謝謝!

struct LinkedList{ 
    char* line; 
    struct LinkedList* next; 
}; 
struct Node{ 
    char *keyword; 
    char* fileName; 
    struct LinkedList* head; 
}; 
    void* fileRead_runner(void* args){ 
     struct Node* node = (struct Node*)args; 
     FILE* fp; 
     char* out; 
     node->head = malloc(sizeof(char*)+sizeof(struct LinkedList*)); 
     struct LinkedList* curr; 
     curr = node->head; 
     fp = fopen(node->fileName, "r"); 
     int lineNum = 1; 
     char line[512]; 
     int found; 
     int first = 0; 
     while(fgets(line, sizeof(line), fp) != NULL){ 
      found = 0; 
      char* temp = malloc(sizeof(line)); 
      strcpy(temp, line); 
      char* token = strtok(temp, " \t\n"); 
      while(token != NULL && found == 0){ 
       if(strcmp(token, node->keyword) == 0){ 
        found = 1; 
       } 
       token = strtok(NULL, " \t\n"); 
      } 
      if(found == 1){ 
       out = malloc(sizeof(line)); 
       char* num = malloc(sizeof(char)*4); 
       snprintf(num, sizeof(num), "%d: ", lineNum); 
       strcpy(out, node->fileName); 
       strcat(out, ", "); 
       strcat(out, num); 
       strcat(out, line); 
       if(first != 0){ 
        curr->next = malloc(sizeof(struct LinkedList*)); 
        printf("%d\n", strlen(curr->line)); 
        curr = curr->next; 
       } 
       curr->line = malloc(sizeof(out)); 
       strcpy(curr->line, out); 
       first = 1; 
       //curr->next = NULL; 
       printf("out: %d\n", strlen(curr->line)); 
      } 
      lineNum++; 
     } 
    } 

輸出:

out: 202 
26 
out: 18 
18 
out: 94 
26 
out: 155 
26 
out: 242 
26 
out: 96 
26 
out: 27 
26 
out: 133 
26 
out: 25 
26 
out: 93 
26 
out: 35 

回答

2
  curr->line = malloc(sizeof(out)); 

由於outchar *,這個分配的字節數爲curr->line等於指針多少字節需要。這是沒有意義的。也許你想要:

  curr->line = malloc(strlen(out) + 1); 

這分配足夠的空間來存儲字符串和一個零字符來標記其結束。

+0

我知道我會犯最愚蠢的錯誤。我剛剛開始使用C,所以我正在使用它。謝謝您的幫助。順便說一句,你知道我是否可以改變搖擺,因爲它似乎誤導? –

+0

沒關係我想! –

+0

@Mustafa如果你按照David的說明分配一個緩衝區,然後使用'strcpy'將一個字符串複製到它,你可能需要考慮使用'strdup'函數,它可以一次完成這兩件事。 –

相關問題