point的定义是 char* point=(char*)malloc(1),然后在foo()函数中对其进行realloc,导致p的地址改变了,问一下怎么样将p改变后的地址传给调用函数,还有调用函数中再对point进行free()的话会报两次free的错,point指针在foo()函数中realloc后在主函数中不调用free()能否会有内存问题?
解决方案
10
成对编程,如在foo中realloc之前,先if判断point能否为空,如为空,则free().
同样,主函数中free前也应做能否为空的判断。
至于地址,只要主函数可以获得point指针,那么它指向的新地址就可以通过取址符&获取
同样,主函数中free前也应做能否为空的判断。
至于地址,只要主函数可以获得point指针,那么它指向的新地址就可以通过取址符&获取
100
realloc假如成功,其返回值是新的地址(新的地址可能与原来相同 也可能不同)
reallocf过一样需要free,否则会内存泄露
free后将指针设置成NULL,这样再次free也不会有问题
reallocf过一样需要free,否则会内存泄露
free后将指针设置成NULL,这样再次free也不会有问题
20
仅供参考:
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #define MAXCHARS 512 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; char PROG[256]="PROG";//程序Program需要的文件列表 char LIST[256]="LIST";//dir /b /s生成的实际文件列表List FILE *fp,*fl; int i,c,n,L,hh; int ignore_case=0; char ln[MAXCHARS]; int icompare(const void *arg1,const void *arg2) { return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) { return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) { if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写 if ((fl=fopen(LIST,"rt"))==NULL) { fprintf(stderr,"Can not open %s\n",LIST); fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]); return 1; } if ((fp=fopen(PROG,"rt"))==NULL) { fclose(fl); fprintf(stderr,"Can not open %s\n",PROG); fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]); return 2; } buf=(char *)malloc(MAXLINES*MAXCHARS); if (NULL==buf) { fclose(fl); fclose(fp); fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS); return 4; } n=0; hh=0; i=0; while (1) { if (fgets(ln,MAXCHARS,fl)==NULL) break;// hh++; L=strlen(ln)-1; if ("\n"!=ln[L]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS); while (1) { c=fgetc(fl); if ("\n"==c || EOF==c) break;// } } while (1) {//去掉行尾的"\n"和空格 if ("\n"==ln[L] || " "==ln[L]) { ln[L]=0; L--; if (L<0) break;// } else break;// } if (L>=0) { strcpy(buf+i,ln);i+=MAXCHARS; n++; if (n>=MAXLINES) { MAXLINES2=MAXLINES*2; if (MAXLINES2==1280000) MAXLINES2=2500000; buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS); if (NULL==buf2) { free(buf); fclose(fl); fclose(fp); fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS); return 5; } buf=buf2; MAXLINES=MAXLINES2; } } } fclose(fl); if (ignore_case) qsort(buf,n,MAXCHARS,icompare); else qsort(buf,n,MAXCHARS,compare); hh=0; while (1) { if (fgets(ln,MAXCHARS,fp)==NULL) break;// hh++; L=strlen(ln)-1; if ("\n"!=ln[L]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS); while (1) { c=fgetc(fp); if ("\n"==c || EOF==c) break;// } } while (1) {//去掉行尾的"\n"和空格 if ("\n"==ln[L] || " "==ln[L]) { ln[L]=0; L--; if (L<0) break;// } else break;// } if (L>=0) { if (ignore_case) { if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln); } else { if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln); } } } fclose(fp); free(buf); return 0; }