在内存中复制数据时,realloc有多深?

时间:2011-03-30 13:10:17

标签: c

在下面的代码示例中,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;
}

1 个答案:

答案 0 :(得分:4)

realloc只有一级深度。它甚至不知道你传递指针到指针,因为它的参数被转换为void*,它的参数类型。就mallocreallocfree而言,内存只是一个平坦的字节数组。如果您将指针存储在内存中,那么您可以选择,但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}}