Итак, у меня есть эта функция, которая выделяет и инициализирует 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,
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
на этом этапе, и у меня нет проблем или ошибок (ну, не то, что я обнаружил) при заполнении, манипулировании и чтении этих массивов связанных списков в программе. Я предполагаю, что я делаю что-то странное с памятью, но я не вижу, где.