我试图使用Valgrind调试我的代码,但是我确实遇到了一些有读取功能的问题。
这是Valgrind日志:
==4333== Syscall param read(buf) points to unaddressable byte(s)
==4333== at 0x4F0C600: __read_nocancel (in /lib64/libc-2.18.so)
==4333== by 0x400AB7: my_read (get_next_line.c:132)
==4333== by 0x400B6C: get_next_line (tmp.c:25)
==4333== by 0x400B27: main (get_next_line.c:146)
==4333== Address 0x401000 is not stack'd, malloc'd or (recently) free'd
==4333==
==4333==
==4333== HEAP SUMMARY:
==4333== in use at exit : 4,106bytes in 1 blocks
==4333== total heap usage: 1 allocs, 0 frees, 4,106 bytes allocated
==4333==
==4333== 4,106 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4333== at 0x4C277AB: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==4333== by 0x400A59: my_read (get_next_line.c:129)
==4333== by 0x400B6C: get_next_line (tmp.c:25)
==4333== by 0x400B27: main (get_next_line.c:146)
==4333==
==4333== LEAK SUMMARY:
==4333== definitely lost: 4,106 bytes in 1 blocks
以下是代码:
int my_read(int fd)
{
char *str;
void *buff;
int x;
str = NULL;
if ((buff malloc(BUFFER_SIZE + 10)) == NULL)
return (NULL);
buff = NULL;
while ((x = read(fd, buff, BUFFER_SIZE)) > 0) //LINE 132
str = (str == NULL) ? my_strdup(buff) : my_strcat(buff, str);
return (str);
}
BUFFER_SIZE定义为4096。
我理解错误,但我不知道如何进行此操作。 如果你们能帮助我解决这个问题,那就太棒了。 TY。
答案 0 :(得分:2)
问题是
buff = NULL;
语句。在为buffer
分配空间后,您将忘记并使用NULL
覆盖该空格,然后在致电read()
时使用该空格。摆脱那种说法。
在从函数返回之前,您还需要free(buff);
。否则,每次拨打my_read()
时,您都会泄漏内存。
因为你返回一个指针,所以应该声明该函数:
char * my_read(int fd)