我在主声明双指针和这样的libc检测*** ./textfileread.exe:realloc()的:无效下一尺寸:0x08643008
char **group_name;
group_name = realloc(NULL, 1);
group_name[0] = realloc(NULL ,20);
我已经过了这个阵列的功能分配存储器,
group_count(object, count, group_name);
它使用realloc。它会罚款,直到它填充前四次重新分配,但在第五次,它会给出错误。
libc detected *** ./textfileread.exe: realloc(): invalid next size: 0x08643008
int group_count(struct friends obj[], char cn, char **grp_nm)
{
int i=0,j=0;
int grp_cn=0;
char check=0;
strcpy(grp_nm[0],obj[0].group);
grp_cn++;
grp_count++;
for(i=1;i<cn;i++) {
for(j=0;j<grp_cn;j++) {
if(strcmp(grp_nm[j],obj[i].group)==0)
check=1;
}
if(check==0) {
grp_cn++;
grp_count++;
printf("\t%d\n",grp_cn);
grp_nm = realloc(grp_nm, grp_cn); //at grp_cn=5 allocation gives error
printf("\t%d\n",grp_nm);
if(grp_nm == NULL) printf("\t%d\n",grp_cn); // this 'if' didnt run, means no NULL return
grp_nm[grp_cn-1] = realloc(NULL ,20);
strcpy(grp_nm[grp_cn-1],obj[i].group);
}
check=0;
}
}
printf(“\ t%d \ n”,grp_nm)的输出;下面给出,这之后再分配
2
140783624
3
140783624
4
140783624
5
*** glibc detected *** ./textfileread.exe: realloc(): invalid next size: 0x099c8008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0x17b961]
lib/i386-linux-gnu/libc.so.6(+0x6f1ad)[0x17f1ad]
/lib/i386-linux-gnu/libc.so.6(realloc+0xe9)[0x180579]
./textfileread.exe[0x804934e]
./textfileread.exe[0x8048b42]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x126e37]
./textfileread.exe[0x8048751]
======= Memory map: ========
00110000-0026a000 r-xp 00000000 08:02 1570626 /lib/i386-linux-gnu/libc-2.13.so
的第五次迭代5后,在屏幕上输出,地址应显示为它显示4之后,但它没有,那么为什么在5给它的错误?
你倒是应该用printf( “%P”,grp_nm)用于显示指针。这将使用有意义的格式,避免有关ptr-to-int隐式转换的警告,并且如果碰巧在具有不同int /指针大小的系统上使用代码,则不会垃圾输出。 – PypeBros 2012-08-14 08:32:30