在下面的代码示例中,realloc释放我为10个字符串“1234567890”分配的内存,当它移动我的p1或者我有泄漏时?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ( int argc, char *argv[] )
{
char **p1 = NULL;
char *p2 = NULL;
int i;
p1 = (char **) malloc ( 100 );
for ( i = 0; i < 10; i ++ )
{
p1[i] = (char *) malloc(10);
memcpy ( p1[i], "1234567890", 10 );
}
p2 = malloc ( 100 );
p1 = (char **) realloc ( p1, (1000 * sizeof(**p1)));
for ( i = 0; i < 10; i ++ )
{
fprintf ( stdout, "p1: %s\n", p1[i] );
}
free(p1);
free(p2);
return 0;
}
答案 0 :(得分:4)
realloc
只有一级深度。它甚至不知道你传递指针到指针,因为它的参数被转换为void*
,它的参数类型。就malloc
,realloc
和free
而言,内存只是一个平坦的字节数组。如果您将指针存储在内存中,那么您可以选择,但malloc
无关紧要。
但是,直到free(p1)
才会发生内存泄漏,realloc
也不会递归到指针数组中。 (sizeof(char *) < 10
仍将复制存储在缓冲区中的指针,如果块被放大。当它缩小时,你就会遇到麻烦。)
此外,您的程序的行为未定义,因为您没有检查错误返回,并且以下仅适用于p1 = (char **) malloc ( 100 );
for ( i = 0; i < 10; i ++ )
{
p1[i] = (char *) malloc(10);
memcpy ( p1[i], "1234567890", 10 );
}
:
{{1}}