我用三指针写了一个程序。当我不释放内存时,我没有得到错误,否则我得到核心转储错误。该计划是:
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)
我不明白为什么会这样?请解释一下。
答案 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)
,但您没有动态为其分配内存。