初始化链接列表数组时无效写入

问题描述 投票:0回答:1

因此,我具有此函数,它将分配并初始化为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指针数组,以便可以用链接的......>

c memory valgrind allocation
1个回答
1
投票

此:

toks_groups = malloc(sizeof(toks_groups) * size + 1))
© www.soinside.com 2019 - 2024. All rights reserved.