我正在尝试一个例子
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)
无法理解编译中断的原因。
答案 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()
会成功(假设上面的行是编辑错误而不应该在那里)。
此外,这是运行时错误,而不是您所说的“编译错误”。
此外,典型的错误适用:
malloc()
。这同样适用于realloc()
。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返回的地址, 不是指向的基地址。