因此,我具有此函数,它将分配并初始化为NULL
,这将是链接列表的数组。我实际上希望此函数返回NULL
指针数组,以便以后可以用链接列表填充它。
static t_tokens **init_tokens_groups(size_t size)
{
t_tokens **toks_groups;
if (!(toks_groups = malloc(sizeof(toks_groups) * size + 1)))
exit(EXIT_FAILURE);
while (size + 1)
{
printf("size: %zu\n", size);
toks_groups[size] = NULL;
size--;
}
return (toks_groups);
}
它工作正常,但是当我在Valgrind中运行程序(这是一个极简的shell)时,>]
valgrind --track-origins=yes ./mysh
我正在遇到这个:
==4914== Invalid write of size 8 ==4914== at 0x10AD6B: init_tokens_groups (tokens_split.c:39) ==4914== by 0x10AE06: split_tokens (tokens_split.c:68) ==4914== by 0x1093D9: prompt_loop (sh21.c:38) ==4914== by 0x10944A: main (sh21.c:57) ==4914== Address 0x4a508f8 is 8 bytes inside a block of size 9 alloc'd ==4914== at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4914== by 0x10AD42: init_tokens_groups (tokens_split.c:35) ==4914== by 0x10AE06: split_tokens (tokens_split.c:68) ==4914== by 0x1093D9: prompt_loop (sh21.c:38) ==4914== by 0x10944A: main (sh21.c:57) ==4914== ==4914== Invalid write of size 8 ==4914== at 0x10AD6B: init_tokens_groups (tokens_split.c:39) ==4914== by 0x10AE06: split_tokens (tokens_split.c:68) ==4914== by 0x109369: dispatch (sh21.c:19) ==4914== by 0x1093F6: prompt_loop (sh21.c:42) ==4914== by 0x10944A: main (sh21.c:57) ==4914== Address 0x4a509f8 is 8 bytes inside a block of size 9 alloc'd ==4914== at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4914== by 0x10AD42: init_tokens_groups (tokens_split.c:35) ==4914== by 0x10AE06: split_tokens (tokens_split.c:68) ==4914== by 0x109369: dispatch (sh21.c:19) ==4914== by 0x1093F6: prompt_loop (sh21.c:42) ==4914== by 0x10944A: main (sh21.c:57)
我真的不明白它的来源,因为我只是在现阶段初始化指向
NULL
的指针,并且在填充,操作时没有问题或错误(嗯,不是我检测到的)。并读取程序中的那些链表数组。我以为我正在对内存做一些奇怪的事情,但是我看不到哪里。
所以我有这个函数,它将分配一个链接列表数组并将其初始化为NULL。我实际上希望此函数返回一个NULL指针数组,以便可以用链接的......>
此:
toks_groups = malloc(sizeof(toks_groups) * size + 1))