在C中重新分配内存时编译中断

时间:2012-11-27 14:42:45

标签: c memory memory-management malloc

我正在尝试一个例子

int main(){
    int count = 5;
    char *a = "JOSUA";
    char *c = "JANETALAE";
    char *b = NULL;
    char *d = NULL;
    b = (char *)malloc(sizeof(char)*5);
    b = a;
    if(b == NULL){
        printf("\n malloc failed");
    }
    printf("\nChar is:%s\n",b);
    d = (char *)realloc(b,sizeof(char) * 9);
    if(d == NULL){
        printf("\n realloc failed");
    }
    else{
        b = d;
        b = c;                                                                                                                                                                             
    }
    printf("\nChar is:%s\n",b);
    return 0;
}

我正在尝试一个示例程序来分配和重新分配内存。但我无法重新分配内存并获得如下编译中断。

Char is:JOSUA
*** glibc detected *** ./realloc: realloc(): invalid pointer: 0x080485b4 ***
======= Backtrace: ========= /lib/libc.so.6[0x88ffd1] /lib/libc.so.6(realloc+0x2cf)[0x89613f] /lib/libc.so.6(realloc+0x2e7)[0x896157] ./realloc[0x80484aa] /lib/libc.so.6(__libc_start_main+0xe6)[0x836e16] ./realloc[0x8048391]
======= Memory map: ======== 007fc000-0081c000 r-xp 00000000 fd:00 659977     /lib/ld-2.12.90.so 0081c000-0081d000 r--p 0001f000 fd:00 659977     /lib/ld-2.12.90.so 0081d000-0081e000 rw-p 00020000 fd:00 659977     /lib/ld-2.12.90.so 00820000-009ad000 r-xp 00000000 fd:00 660018     /lib/libc-2.12.90.so 009ad000-009af000 r--p 0018c000 fd:00 660018     /lib/libc-2.12.90.so 009af000-009b0000 rw-p 0018e000 fd:00 660018     /lib/libc-2.12.90.so 009b0000-009b3000 rw-p 00000000 00:00 0  00a29000-00a45000 r-xp 00000000 fd:00 660039     /lib/libgcc_s-4.5.1-20100924.so.1 00a45000-00a46000 rw-p 0001b000 fd:00 660039     /lib/libgcc_s-4.5.1-20100924.so.1 00a84000-00a85000 r-xp 00000000 00:00 0          [vdso] 08048000-08049000 r-xp 00000000 fd:02 9440701    /home/user/beata/c_samples/realloc 08049000-0804a000 rw-p 00000000 fd:02 9440701    /home/user/beata/c_samples/realloc 092ac000-092cd000 rw-p 00000000 00:00 0          [heap] b78bc000-b78bd000 rw-p 00000000 00:00 0  b78d3000-b78d5000 rw-p 00000000 00:00 0  bfbd8000-bfbf9000 rw-p 00000000 00:00 0          [stack] Aborted (core dumped)

无法理解编译中断的原因。

7 个答案:

答案 0 :(得分:4)

你不能在静态内存变量(实际上是a)上使用realloc:

b = (char *)malloc(sizeof(char)*5);
b = a;

答案 1 :(得分:2)

可能会替换:

b=a;

使用:

strcpy(b,a);

会让你朝着正确的方向前进。我想也许你认为b=a;实际上在做什么?

但请确保您已在堆上分配了足够的内存,即不要忘记字符串末尾隐含的'\ 0',例如

b = (char *)malloc(sizeof(char)*5);

应该是:

b = malloc(6);

如果你想让"JOSUA"适合"JOSUA"实际上是"JOSUA\0"

答案 2 :(得分:1)

您正在向realloc()传递无效指针,正如错误所示。

这是从这一行:

b = a;

使用字符串文字的地址覆盖malloc()的返回值。您无法将其传递给realloc()

你在这个程序中的整体逻辑非常破碎;如果malloc()失败,则没有理由相信realloc()会成功(假设上面的行是编辑错误而不应该在那里)。

此外,这是运行时错误,而不是您所说的“编译错误”。

此外,典型的错误适用:

  1. 在C中,don't cast the return value of malloc()。这同样适用于realloc()
  2. 不要使用sizeof (char),这只是写一个非常麻烦的方式。

答案 3 :(得分:1)

 b = (char *)malloc(sizeof(char)*5);
 b = a;

你刚刚丢失了malloc返回的地址。

如果您传递的任何其他地址导致未定义的行为,那么您需要将malloc返回的地址传递给realloc。这就是您的代码所做的。

答案 4 :(得分:1)

您尝试重新分配尚未进行malloc的内存:

  9     b = (char *)malloc(sizeof(char)*5);
 10     b = a;

第10行你的第9行在10日没用了,malloc返回的地址丢失了。 此外,do not cast the return of malloc因为这可以隐藏其他错误。

答案 5 :(得分:1)

这是一行:

10     b = a;

这里,您将指针b设置为指针a中存储的地址。所以b现在指向字符串“JOSHUA”。

当您尝试重新分配b时,您正在向它提供该地址,该地址最初并非由malloc分配。你想要做的是将字符串从a复制到b:

strcpy(b,a);

但是,您需要增加b。

指向的内存大小

答案 6 :(得分:1)

问题 b =(char *)malloc(sizeof(char)* 5); 然后立即改变指向b的地址 通过分配a所指向的基地址。 即 b = a; / *这是错误* / 。 对于重新分配,您必须传递malloc返回的地址, 不是指向的基地址。