我用三指针写了一个程序。当我没有释放内存时,我不会得到错误,否则我会得到核心转储错误。程序是:
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)
我不明白为什么会这样?请解释一下。
最佳答案
使用以下代码释放内存:
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)
,但尚未为其动态分配内存。关于c - 释放时出现三重指针错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38430802/