realloc()无法重新分配内存

时间:2014-03-29 09:33:34

标签: c realloc

我正在编写一个文件复制程序,其中我遇到了关于realloc()的困难。 请查看以下代码片段(我写的是为了解realloc()的工作情况): -

int main(){
    char *p =(char *) malloc ( 10 ),*t;
    p = "this is";
    if (strlen (p)==7)
    {
        t = realloc ( p,14);
        if ( t==NULL)
        {
            printf ("no no\n");
        }
    }
    printf("%p\n%p\n%d",p,t,strlen(p));
    free (p);
    free (t);
    return 1;
}

输出

no no      //because realloc () is unable to reallocate  the memory
00450357   //address of p
00000000   //address of t

那么为什么realloc()无法重新分配内存并将其(地址)分配给t

修改 我在Windows中使用代码块。

3 个答案:

答案 0 :(得分:7)

您已通过静态字符串的地址覆盖了malloc返回的值。然后realloc接收静态字符串的地址作为重新分配的参数。

char *p =(char *) malloc ( 10 ),*t;
p = "this is";
t = realloc ( p,14);

你可能想要的是:

char *p =(char *) malloc ( 10 ),*t;
strcpy(p, "this is");
t = realloc ( p,14);

答案 1 :(得分:2)

分配到p后你正在做

p = "this is";

会覆盖malloc()返回的值。由于p指向的内存不可自由,realloc()失败。

复制字符串do

strcpy(p, "this is");

虽然check p分配了足够的内存,否则请使用

strncpy(p, "this is", length_of_p);

答案 2 :(得分:1)

realloc的手册页指出,除非realloc的第一个参数为NULL,否则必须先前调用malloc,{{1} },或calloc

realloc

上述语句将t = realloc (p, 14); 传递给prealloc指向字符串文字"this is",它具有静态存储持续时间,虽然不是const限定的,但是只读。因此,您的程序会调用未定义的行为。(由于段错误,它在我的计算机上崩溃了。)

此外,当您重新分配p字符串文字的第一个元素的地址时,您将失去对动态分配的内存的处理,从而导致内存泄漏。

char *p =(char *) malloc ( 10 ),*t;
p = "this is";

您实际需要做的是使用strcpy将字符串文字的内容复制到动态分配的缓冲区。

// include the required headers

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// explicitly state void in the parameter list of main
int main(void) {
    // do not cast the result of malloc
    char *p = malloc(10 * sizeof *p);
    char *t;
    if(p == NULL) {
        printf("malloc failed\n");
        return 1;
    }
    // beware of buffer overrun by strcpy
    // consider using the safer strncpy if it suits
    p = strcpy(p, "this is");
    if(strlen(p) == 7) {
        // save the result of realloc in t
        // in case, realloc fails to allocate
        t = realloc(p, 14);
        if(t == NULL) {
            printf("realloc failed\n");
            // handle it
            // p points to old buffer
        }
        else {
            t = NULL;
            // p points to new buffer
        }
    }

    // after your done with p, free it
    free(p);

    return 0;
}