3

我正在尝试一个例子

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)

无法理解为什么会发生编译中断。

4

7 回答 7

4

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

b = (char *)malloc(sizeof(char)*5);
b = a;
于 2012-11-27T14:46:20.237 回答
2

也许替换:

b=a;

和:

strcpy(b,a);

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

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

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

应该:

b = malloc(6);

如果你想适应"JOSUA"它("JOSUA"实际上是"JOSUA\0"

于 2012-11-27T14:51:17.947 回答
1

realloc()正如错误所说,您正在传递一个无效的指针。

它来自这一行:

b = a;

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

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

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

此外,典型的错误适用:

  1. 在 C 中,不要强制转换malloc(). 这也同样适用于realloc()
  2. 不要用sizeof (char), 只是写 1 的一种很麻烦的方式。
于 2012-11-27T14:45:04.730 回答
1
 b = (char *)malloc(sizeof(char)*5);
 b = a;

在那里,您刚刚丢失了返回的地址malloc

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

于 2012-11-27T14:45:11.840 回答
1

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

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

你这里的第 9 行到第 10 行就变得无用了,并且 malloc 返回的地址丢失了。此外,不要强制返回 malloc,因为这会隐藏其他错误。

于 2012-11-27T14:45:38.613 回答
1

这是行:

10     b = a;

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

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

strcpy(b,a);

但是,您将需要增加 b 指向的内存大小。

于 2012-11-27T14:50:01.767 回答
1

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

于 2012-11-27T16:40:29.663 回答