释放时三重指针错误

时间:2016-07-18 07:24:12

标签: c pointers

我用三指针写了一个程序。当我不释放内存时,我没有得到错误,否则我得到核心转储错误。该计划是:

int main (int argc, char *argv[])
{
    char*** ptr;
    ptr = (char ***) malloc (3 * sizeof (char **));
    for (int i = 0; i < 3; i++)
    {
    *(ptr + i) = (char **) malloc (sizeof(char *) * 4);
    for (int j = 0; j < 4; j++)
    {
        *(*(ptr+i)+j) = "This is good";
    }
    }
    for (int i = 0; i < 3; i++)
    {
    for (int j = 0; j < 4; j++) {
        printf("%s\t", *(*(ptr+i)+j));
        free(*(*(ptr+i)+j));
    }
    putchar ('\n');
    free (*(ptr+i));
    }
    free(ptr);

    return 0;
}

当我省略包含free()的三行时,程序正常运行。但否则会出现错误,如下所示:

*** Error in `./test': munmap_chunk(): invalid pointer: 0x0000000000400814 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f29cfbda725]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x1a8)[0x7f29cfbe6c18]
./test[0x40075e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f29cfb83830]
./test[0x400579]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 9442619                            /home/debdut/Code/om_edit/test/test
00600000-00601000 r--p 00000000 08:01 9442619                            /home/debdut/Code/om_edit/test/test
00601000-00602000 rw-p 00001000 08:01 9442619                            /home/debdut/Code/om_edit/test/test
00960000-00981000 rw-p 00000000 00:00 0                                  [heap]
7f29cf94d000-7f29cf963000 r-xp 00000000 08:01 2363853                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f29cf963000-7f29cfb62000 ---p 00016000 08:01 2363853                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f29cfb62000-7f29cfb63000 rw-p 00015000 08:01 2363853                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f29cfb63000-7f29cfd23000 r-xp 00000000 08:01 2363815                    /lib/x86_64-linux-gnu/libc-2.23.so
7f29cfd23000-7f29cff22000 ---p 001c0000 08:01 2363815                    /lib/x86_64-linux-gnu/libc-2.23.so
7f29cff22000-7f29cff26000 r--p 001bf000 08:01 2363815                    /lib/x86_64-linux-gnu/libc-2.23.so
7f29cff26000-7f29cff28000 rw-p 001c3000 08:01 2363815                    /lib/x86_64-linux-gnu/libc-2.23.so
7f29cff28000-7f29cff2c000 rw-p 00000000 00:00 0 
7f29cff2c000-7f29cff52000 r-xp 00000000 08:01 2363787                    /lib/x86_64-linux-gnu/ld-2.23.so
7f29d012c000-7f29d012f000 rw-p 00000000 00:00 0 
7f29d014e000-7f29d0151000 rw-p 00000000 00:00 0 
7f29d0151000-7f29d0152000 r--p 00025000 08:01 2363787                    /lib/x86_64-linux-gnu/ld-2.23.so
7f29d0152000-7f29d0153000 rw-p 00026000 08:01 2363787                    /lib/x86_64-linux-gnu/ld-2.23.so
7f29d0153000-7f29d0154000 rw-p 00000000 00:00 0 
7ffc06195000-7ffc061b6000 rw-p 00000000 00:00 0                          [stack]
7ffc061e9000-7ffc061eb000 r--p 00000000 00:00 0                          [vvar]
7ffc061eb000-7ffc061ed000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
This is good    Aborted (core dumped)

我不明白为什么会这样?请解释一下。

2 个答案:

答案 0 :(得分:1)

您正尝试将之前指定的字符串文字释放到char指针:

*(*(ptr+i)+j) = "This is good";

此内存未使用malloc分配,因此不应释放。

答案 1 :(得分:1)

您可以使用以下代码释放您的记忆:

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++) {
        printf("%s\t", *(*(ptr+i)+j));
        free(*(*(ptr+i)+j));
    }
    putchar ('\n');
    free (*(ptr+i));
}
free(ptr);

但问题出现了,因为你没有为*(*(ptr+i)+j)动态分配任何内存,所以你也无法释放它。

将上面的代码更改为:

for (int i = 0; i < 3; i++)
    free (*(ptr+i));
free(ptr);

一般情况下,请记住,您应该free仅动态分配的内容。在这里,您有malloc'ed个指针ptr*(ptr + i),因此这些应该是唯一要释放的指针。您可能正在使用指针*(*(ptr+i)+j),但您没有动态为其分配内存。