user-0 提问: 帮我看看是不是realloc出的问题

回复:
user: user-1
content: 对于你的代码，我做了简单修改，但是基本上原文不变，只是为了我容易调试代码而改的。代码后加了些注释，表示我对代码修改的意见。    #include<stdio.h> #include<stdlib.h> int main() { 	int n; 	int i; 	int m,k; 	char c; 	char *t;  	printf("How many STRING will you input\n"); 	scanf("%d",&n); 	fflush( stdin ); 	printf("Input STRING and end with #\n");  	for( i=0;i<n;i++) 	{ 		m=1; 		k=0; 		c=getchar(); 		fflush( stdin );  //TODO: stdin是系统的输入缓存，所有键盘输入的字符暂存在这里，不清除多余的字符就会影响下次读取，这里是将多余的字符清理掉，最好选择性使用这个 		t=(char *)malloc(0); //TODO: 这里做没什么作用，等同：t=NUll 		while(c!='#') 		{ 			t=(char*)realloc((void *)t,m);  //TODO: 这里的m似乎永远只等于1，那就没必要再声明一个变量了，直接写1，程序看起来就好多了 			t[k]=c;  //TODO: 字符串需要以'\0'结束，因为打印时需要以'\0'作为结束符 			c=getchar();	 			fflush( stdin ); 		} 		printf("%s\n",t); 	} 	return 0; }

user: user-2
content: t=(char*)realloc((void *)t,m); t[k]=c; m为1，那么这个t已经是越界了，少个用于存放'\0'的空间，因为后面你是printf 按照%s输出的。 可能t[k++] = c;才是真是逻辑。但是这样以来就更越界了。  t=(char *)malloc(0);  这条语句没有意义，和t = NULL;没有区别。

user: user-3
content: t[k++]=c 另外，你的输入的\n貌似没有没有处理。

user: user-4
content: 仅供参考：//文件1中的内容排序并去重,结果保存到文件2中 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; int c,n,hh,i,L; FILE *f; char ln[MAXCHARS]; int ignore_case=0; 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<3) {         printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");         printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);         return 1;     }     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not find file %s!\n",argv[1]);         return 1;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(f);         printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 2;     }     n=0;     hh=0;     i=0;     while (1) {         if (NULL==fgets(ln,MAXCHARS,f)) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);             while (1) {                 c=fgetc(f);                 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) {                     printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     printf("WARNING: Lines >%d ignored.\n",MAXLINES);                     break;//                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(f);     if (n>1) {         if (ignore_case) qsort(buf,n,MAXCHARS,icompare);         else qsort(buf,n,MAXCHARS,compare);     }     f=fopen(argv[2],"w");     if (NULL==f) {         free(buf);         printf("Can not create file %s!\n",argv[2]);         return 2;     }     fprintf(f,"%s\n",buf);     if (n>1) {         if (ignore_case) {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if (stricmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         } else {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         }     }     fclose(f);     free(buf);     return 0; }