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
我知道我会犯最愚蠢的错误。我刚刚开始使用C,所以我正在使用它。谢谢您的帮助。顺便说一句,你知道我是否可以改变摇摆,因为它似乎误导? –
没关系我想! –
@Mustafa如果你按照David的说明分配一个缓冲区,然后使用'strcpy'将一个字符串复制到它,你可能需要考虑使用'strdup'函数,它可以一次完成这两件事。 –