我正在尝试使用链表创建缓冲区队列。我正在使用 pthreads 作为生成线程和多个读取线程。我的程序正确地使用 pthread 打开文件并开始将文件的行读取到 char plain_text[120];并添加一个 null 字符,然后将该参数传递到以下函数中。
void enqueue(char word[])
{
struct queue_node *new_node = malloc(sizeof(struct queue_node));
if(new_node == NULL)
{
printf("Failed to allocate memory in enqueuen");
exit(-1);
}
new_node->word = malloc(sizeof(strlen(word)+1));
if(new_node->password == NULL)
{
printf("Failed to allocate memory in enqueue for the passwordn");
exit(-1);
}
strcpy(new_node->word, word);
new_node->next_node = NULL;
enqueued++;
if(head==NULL)
{
head = new_node;
previous_node = head;
current_node = head;
deleting_node = head;
}
else
{
previous_node->next_node = new_node;
previous_node = previous_node->next_node;
}
}
使用的结构是这样的:
struct queue_node
{
char* password;
struct queue_node *next_node;
};
我的代码运行了大约 2000 个单词,然后用 SegFault 击中了我。
GDB 其中,产生这个:
0 0x00007ffff71a3118 in _int_malloc (( 来自/usr/lib/libc.so.6
1 0x00007ffff71a43d4 in malloc (( from/usr/lib/libc.so.6
2 0x00000000004017cd排队 (word=0x7ffff6d0deb0 "!!626Ru"( 在主.C:217
3 0x0000000000401779 in Dictionary_fill (arg=0x7fffffffeba5( 在主.c:195
4 0x00007ffff74d44a4 in start_thread (( from/usr/lib/libpthread.so.0
克隆 (( 中的 5 0x00007ffff721213d 来自/usr/lib/libc.so.6
我猜我用malloc分配不当,但是我已经搜索了几天,把头撞在墙上,似乎无法弄清楚。
错误的:
new_node->word = malloc(sizeof(strlen(word)+1));
您不希望sizeof
在那里,否则您将无法为字符串分配足够的存储空间。
当然应该是:
new_node->word = malloc(strlen(word)+1);
new_node->word = malloc(sizeof(strlen(word)+1));
不要在这里使用sizeof
.就写——
new_node->word = malloc(strlen(word)+1);
在这种情况下,您将内存分配给new_node->word
因此请检查它是否NULL
-
if(new_node->password == NULL)
检查这个 -
if(new_node->word== NULL)