2017-03-02 11 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のバイト数を割り当てられました。それは意味をなさない。おそらくあなたが望むかもしれません:

これは、文字列を格納するのに十分なスペースと、その終わりを示すゼロ文字を割り当てます。

+0

私は間違ったことを間違えていることは知っていました。私はちょうどCを使用し始めたので、私はそれに慣れています。助けてくれてありがとう。 Btwあなたが誤解を招くように私が小屋を変えることができるかどうか知っていますか? –

+0

私は考えなかった! –

+0

@Mustafa Davidさんが説明したようにバッファを割り当ててから文字列をコピーするために 'strcpy'を使うと、一度に両方のことを行う' strdup'関数の使用を検討したいかもしれません。 –

関連する問題