0

freeポインターを呼び出さない限り、正常に実行されているように見える ac プログラムがあります。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int i;
    gid_t *list;

    int num_groups = getgroups(0, NULL);

    list = malloc(num_groups * sizeof(list));

    if (getgroups(num_groups, list) != -1)
    {
        for (i = 0; i < num_groups; i++)
        {
            printf("%d ", *list++);
        }
    }
    free(list); // free(): invalid size: 0x0000000002448040 ***
    return 0;
}

私は、無効な次のサイズを参照しているが、無効なサイズを参照していない同様の投稿をたくさん見てきました。

私はcに関しては初心者なので、何が起こっているのかわかりません。

4

1 に答える 1

7

あなたは で変更listされている*list++ため、freeは無効です。freeから取得した元のポインタが必要ですmalloc


dasblinkenlight が指摘しているように、メモリを正しい方法で割り当てていません。私はあなたがこのイディオムを目指していたと思いますが、*: を忘れていました:

list = malloc(num_groups * sizeof *list);
                                  ^
于 2013-09-24T19:52:16.783 に答える