当我编译并运行此代码时,出现错误。错误消息是:
realloc(): invalid next size: 0x0000000002119010
文件input
大约有4000个单词。
我调试了它,但我找不到任何问题。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_LEN 10 //buf length
int main(int argc, char *argv[])
{
int file_d; //file descriptor
char *ct_head; //content_first_char
char *content;
ssize_t read_len = BUF_LEN; //had read length
int mem_block_count = 0;
file_d = open("input", O_RDONLY);
if (file_d < 0)
{
perror("open");
exit (1);
}
content = ct_head = (char *) malloc(sizeof(char) * BUF_LEN);
mem_block_count = 1;
while (read_len == BUF_LEN)
{
read_len = read(file_d, ct_head, BUF_LEN);
if (read_len < 0)
{
perror("read");
exit(2);
}
if (read_len == BUF_LEN)
{
ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
ct_head = &content[(mem_block_count-1) * BUF_LEN];
}
else
ct_head[read_len] = '\0';
}
printf("%s", content);
close(file_d);
free(content);
return 0;
}
答案 0 :(得分:0)
我不确定你的问题是什么,但这些内容:
ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
ct_head = &content[(mem_block_count-1) * BUF_LEN];
非常狡猾。在第一行之后,ct_head
指向重新分配的块,content
指向垃圾。然后第二行读取content
并重新分配ct_head
- 泄漏重新分配的内存。
我怀疑你的程序中可能只有内存损坏?
我认为
ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
应该是:
content = (char *)realloc(content, sizeof(char) *(++mem_block_count) * BUF_LEN);
if (content == NULL)
{
// do something if the realloc fails
}
答案 1 :(得分:0)
第一次使用realloc时,它只分配2个字节,因为进入调用时,sizeof(char)
为1,mem_block_count
也为1(然后预先递增为2)。
这意味着下一次读取将超出它已分配的缓冲区。我怀疑你需要在你的realloc中乘以BUF_LEN
。
修改强>
我刚刚意识到,情况更糟:在将内容分配到2个字节之后,您将ct_head
设置为超出内容开头的BUF_LEN
个字节。这意味着您的读取将覆盖完全位于缓冲区之外的区域。
答案 2 :(得分:0)
你已经在这里得到了一些好的答案,但这里有一些不适合评论的建议。在C中,sizeof(char)
始终 1.根据定义,它是1,因此它与使用(1 * BUF_LEN)
一样多余。同样在C中,您不必[而且不应]强制转换malloc
的结果。这样做可以掩盖基本错误 1 。
如果要根据类型的大小分配空间,请使用:
ct_head = malloc(sizeof(*ct_head) * BUF_LEN);
这样,如果ct_head
的类型发生变化,您仍然会分配足够的空间,而无需将所有来电更改为malloc
和realloc
。
<子> 1。如果您没有为malloc
包含适当的标头,则C编译器将假定malloc
返回int
,这可能会导致int
大小的平台出现问题}与指针类型的大小不同。此外,从整数类型到指针类型的转换是实现定义的。