#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char c,*p;
p = (char *)malloc(10);
for(i=0;;i++)
{
c = getchar();
if(i>9)
p = (char *)realloc(p,1);
if(c == '\n')
{
p[i]='\0';
break;
}
else
p[i]=c;
}
printf("%s\n",p);
free(p);
return 0;
}
一个内存分配问题,程序接受终端的输入然后重新输出,当输入超过10个字节时,使用realloc()自动重新分配,问题出来了,当输入的字串长度小于14时,均能正常输出,大于等于14则报错,报错信息如下:
[root@localhost realloc]# ./realloc
1111111111111
1111111111111
[root@localhost realloc]# ./realloc
11111111111111
*** glibc detected *** ./realloc: realloc(): invalid next size: 0x09423008 ***
======= Backtrace: =========
/lib/libc.so.6[0x813e31]
/lib/libc.so.6[0x8190d1]
/lib/libc.so.6(realloc+0xdc)[0x81926c]
./realloc[0x80484c9]
/lib/libc.so.6(__libc_start_main+0xe6)[0x7b9d26]
./realloc[0x80483f1]
======= Memory map: ========
00374000-00375000 r-xp 00000000 00:00 0 [vdso]
00709000-00726000 r-xp 00000000 08:03 2491426 /lib/libgcc_s-4.4.7-20120601.so.1
00726000-00727000 rw-p 0001d000 08:03 2491426 /lib/libgcc_s-4.4.7-20120601.so.1
00781000-0079f000 r-xp 00000000 08:03 2491452 /lib/ld-2.12.so
0079f000-007a0000 r--p 0001d000 08:03 2491452 /lib/ld-2.12.so
007a0000-007a1000 rw-p 0001e000 08:03 2491452 /lib/ld-2.12.so
007a3000-00934000 r-xp 00000000 08:03 2491453 /lib/libc-2.12.so
00934000-00936000 r--p 00191000 08:03 2491453 /lib/libc-2.12.so
00936000-00937000 rw-p 00193000 08:03 2491453 /lib/libc-2.12.so
00937000-0093a000 rw-p 00000000 00:00 0
08048000-08049000 r-xp 00000000 08:03 4068969 /home/realloc/realloc
08049000-0804a000 rw-p 00000000 08:03 4068969 /home/realloc/realloc
09423000-09444000 rw-p 00000000 00:00 0 [heap]
b782b000-b782c000 rw-p 00000000 00:00 0
b783a000-b783d000 rw-p 00000000 00:00 0
bfcea000-bfcff000 rw-p 00000000 00:00 0 [stack]
返回NULL:当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL时。此时原内存变成“free(游离)”的了。
返回NULL:当没有足够的空间可供扩展的时候。此时,原内存空间的大小维持不变。追问
但是为什么输入字串长度是10-13的时候,它都能正常输出,到14就报错了?
追答这个应该是内存不够了,恰好就能relloc几次