【发布时间】:2021-03-02 19:33:31
【问题描述】:
任务:
分配(使用 malloc(3))并从字符串
s返回一个子字符串。子字符串从索引start开始,最大大小为len。返回值:子字符串。
NULL如果分配失败。
您好,几个小时后,我决定要求澄清一下。我有以下功能和一些我无法理解的 Valgrind 错误,即使一切都正确,也会出现。 (ft_strlen(s)我从我自己的库中调用,其中还放了 malloc 的 lib)。
char *ft_substr(char const *s, unsigned int start, size_t len)
{
unsigned int x;
char *a;
unsigned int i;
i = 0;
if (s == NULL)
return (0);
if (start > ft_strlen(s))
{
if (!(a = (char *)malloc(0*sizeof(char))))
return (0);
return (a);
}
if ((start + len) < ft_strlen(s))
x = len;
else
x = ft_strlen(s) - start;
if (!(a = (char *)malloc((x + 1) * sizeof(char))))
return(0);
while (i < x)
{
a[i] = s[start + i];
i++;
}
a[i] = '\0';
return (a);
}
我故意留下一个错误。如果我想在分配失败时返回 null,为什么下面应该是 0 而不是 1?无论如何,它不会改变下面出现的错误。
if (!(a = (char *)malloc(0 * sizeof(char))))
错误:
==4817== Invalid read of size 1
==4817== at 0x483FED4: strcmp (in /usr/lib/x86_64-linux-gnu/valgrind vgpreload_memcheck-amd64-linux.so)
==4817== by 0x4039BC: main (ft_substr_test.cpp:28)
==4817== Address 0x4dad0d0 is 0 bytes after a block of size 0 alloc'd
==4817== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==4817== by 0x403B58: ft_substr (in /home/tony/42cursus/0lvl_libft_1week/libftTester/a.out)
==4817== by 0x4039A4: main (ft_substr_test.cpp:27)
==4817==
【问题讨论】:
-
当您
malloc(0)时,结果可以是 NULL,也可以是您无法使用的有效指针。从错误消息来看,您似乎得到了后者,并且您将指针传递给了strcmp。在 malloc 之后,尝试使用printf("%p\n", (void *)a);打印指针 -
代码应该是
if (s == NULL || start > ft_strlen(s)) return NULL; -
不,我试过了,但没用@user3386109
-
这段代码既不完整也不是最小的 - 请发布一个完整的程序(
main()),它刚好来演示问题,仅此而已。