我已编写以下代码以清楚地了解malloc和realloc。 我使用malloc初始化指针然后使用realloc,我增加了数组的大小。 但是当我运行代码时,我得到以下错误。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p;
p = malloc(10);
p = " this is it";
printf("\n%s", p);
p = realloc(p, 14);
p[11] = 'A';
p[12] = 'B';
p[13] = 'C';
printf("\n %s", p) ;
return 0;
}
输出:
ajay@ajay-K54L:~$ gcc te.c
ajay@ajay-K54L:~$ ./a.out
*** glibc detected *** ./a.out: realloc(): invalid pointer: 0x000000000040071c ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7fb111e88626]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x2de)[0x7fb111e8d3ee]
./a.out[0x4005dc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fb111e2b76d]
./a.out[0x4004d9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 3027043 /home/ajay/a.out
00600000-00601000 r--p 00000000 08:03 3027043 /home/ajay/a.out
00601000-00602000 rw-p 00001000 08:03 3027043 /home/ajay/a.out
00e76000-00e97000 rw-p 00000000 00:00 0 [heap]
7fb111bf4000-7fb111c09000 r-xp 00000000 08:03 2100801 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111c09000-7fb111e08000 ---p 00015000 08:03 2100801 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e08000-7fb111e09000 r--p 00014000 08:03 2100801 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e09000-7fb111e0a000 rw-p 00015000 08:03 2100801 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e0a000-7fb111fbd000 r-xp 00000000 08:03 2100780 /lib/x86_64-linux-gnu/libc-2.15.so
7fb111fbd000-7fb1121bc000 ---p 001b3000 08:03 2100780 /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121bc000-7fb1121c0000 r--p 001b2000 08:03 2100780 /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121c0000-7fb1121c2000 rw-p 001b6000 08:03 2100780 /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121c2000-7fb1121c7000 rw-p 00000000 00:00 0
7fb1121c7000-7fb1121e9000 r-xp 00000000 08:03 2100760 /lib/x86_64-linux-gnu/ld-2.15.so
7fb1123d2000-7fb1123d5000 rw-p 00000000 00:00 0
7fb1123e5000-7fb1123e9000 rw-p 00000000 00:00 0
7fb1123e9000-7fb1123ea000 r--p 00022000 08:03 2100760 /lib/x86_64-linux-gnu/ld-2.15.so
7fb1123ea000-7fb1123ec000 rw-p 00023000 08:03 2100760 /lib/x86_64-linux-gnu/ld-2.15.so
7ffff08d4000-7ffff08f5000 rw-p 00000000 00:00 0 [stack]
7ffff09ff000-7ffff0a00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
this is itAborted (core dumped)
我在内存分配上做错了什么? 谢谢。
答案 0 :(得分:8)
此:
p = " this is it"; /* Does not copy, use strcpy(). */
将字符串文字的地址指定给p
,并将其从先前由malloc()
返回的地址更改。传递给realloc()
的指针必须是:
...之前由malloc(),calloc()或realloc()分配,但尚未使用free()释放,否则结果未定义。
将作业更改为strcpy()
,例如更正:
p = malloc(12); /* Increased size. */
if (p)
{
strcpy(p, " this is it");
char* tmp = realloc(p, 14); /* Store result in temp to avoid potential */
if (!tmp) /* in the event that realloc() fails. */
{
free(p);
return -1;
}
p = tmp;
/* snip ... */
free(p); /* When 'p' is no longer required. */
}
答案 1 :(得分:3)
您正在使用字符串覆盖malloc()
返回的指针:
p = " this is it";
您应该使用strcpy()
将字符串复制到p
所指向的内存中:
strcpy(p, "this is it");
请注意,上面的字符串需要的空间比你分配的空间多:它是10个可见字符,但是字符串有0个字符作为终结符,所以你需要至少11个字符的空格。
此外,在依赖指针有效之前,您应该检查malloc()
和realloc()
的返回值。如果是NULL
,则分配失败。考虑到您的分配大小,这不太可能,但这是一种很好的做法。
答案 2 :(得分:2)
char *p = malloc(10);
分配大小为10
的内存块,并使p
指向此内存。然后
p = " this is it";
定义一个常量字符串文字,并使p
指向只读内存,存储此常量字符串文字。所以
p = realloc(p, 14);
尝试realloc
此只读内存产生未定义的行为。
您应该复制,而不是将常量字符串文字的地址分配给p
(这也会导致内存泄漏,因为您动态分配的内存地址已丢失)这个字符串使用strcpy
。所以替换这一行:
p = " this is it";
用这个:
strcpy(p, " this is it");