2017-03-02 54 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'函数,它可以一次完成这两件事。 –

相关问题