user-0 提问: 加了free()报错

回复:
user: user-1
content: string3 = join1(string1,string2);这句话使得前面string3 = (char *)malloc(sizeof(char)*N);分配的地址泄漏，再也没有机会free掉了。  string3=join(string,string2)实际上srting3指向静态地址temp,当然不能free了。  另外，你是string1++，srting2++也使得这两个malloc的区域首部没有指针指向他们了，同样会造成内存泄漏。  用指针和malloc，free要特别小心。

user: user-2
content: 二楼说的关于string3没有问题，但是string2和sring1有问题。 楼主的话，建议把书仔细看看，有些概念不是很清楚  int _tmain(int argc, _TCHAR* argv[]) {     char *string1;     char *string2;     char *string3;     string1 = (char *)malloc(sizeof(char)*N);     string2 = (char *)malloc(sizeof(char)*N); 	//可以注释掉这句话     //string3 = (char *)malloc(sizeof(char)*N);     printf("请输入字符串1：");     gets(string1);     printf("请输入字符串2：");     gets(string2); 	//string3 指向了join1中 temp变量的地址，不再是由malloc返回的地址 	//在C，c++中 free只能对由malloc函数返回的变量进行操作 	//这也就是为什么 在 之后的free（string3）会报错的原因 	//事实上这里的sring3 可以不需要malloc分配空间，因为分配的空间，你并没有使用  	//注意这里传入string1和string2并不会改变两个实参中的地址，在下面free是不会有问题 	//因为在这里join1都是拷贝了实参的值，是join1函数中string1和string2都是实参的拷贝     string3 = join1(string1,string2);     printf("%s\n",string3);    	//在这里调用free没有问题 	free(string2); 	free(string1);      string3 = NULL; 	system("pause");          return 0; }

user: user-3
content: nclude "stdafx.h" #include<string.h> #include<stdlib.h> #define N 50  char *join1(char *,char *);   int _tmain(int argc, _TCHAR* argv[]) {     char *string1;     char *string2;     char *string3;     string1 = (char *)malloc(sizeof(char)*N);     string2 = (char *)malloc(sizeof(char)*N);     //string3 = (char *)malloc(sizeof(char)*N);     printf("请输入字符串1：");     gets(string1);     printf("请输入字符串2：");     gets(string2);     string3 = join1(string1,string2);     printf("%s\n",string3);     free(string1);     free(string2);     string3 = NULL;      return 0; }  char *join1(char *string1, char *string2) {     int i,j;     int count1,count2;     static char temp[50];     count1 = strlen(string1);     count2 = strlen(string2);       for(i=0;i<count1;i++)     {         temp[i] = *string1;         string1++;     }     for(i=count1;i<count1+count2;i++)     {         temp[i] = *string2;         string2++;     }     temp[count1+count2] = '\0';      return temp; } string3不用申请空间；因为它是用于指向静态变量temp的，若申请，找不到释放的地方，反而会造成内存泄漏； 静态变量在数据段申请，不能用free释放；程序结束后，系统会释放数据段的空间。 string1,string2需要free掉； 因为其是堆上的空间；

user: user-0
content: 引用 1 楼 twintiger 的回复:string3 = join1(string1,string2);这句话使得前面string3 = (char *)malloc(sizeof(char)*N);分配的地址泄漏，再也没有机会free掉了。  string3=join(string,string2)实际上srting3指向静态地址temp,当然不能free了。  另外，你是string1++，srting2++也使得这两个malloc的区域首部没有指针指向他们了，同样会造成内存泄漏。  用指针和malloc，free要特别小心。 请教： 1、“string3=join(string,string2)实际上srting3指向静态地址temp,当然不能free了“  意思是string3不用free了么？ 2、“string1++，srting2++也使得这两个malloc的区域首部没有指针指向他们了，同样会造成内存泄漏。” 那应该怎么操作，才能避免内存泄漏？

user: user-1
content: 引用 4 楼 sinat_14884161 的回复:二楼说的关于string3没有问题，但是string2和sring1有问题。 楼主的话，建议把书仔细看看，有些概念不是很清楚  int _tmain(int argc, _TCHAR* argv[]) {     char *string1;     char *string2;     char *string3;     string1 = (char *)malloc(sizeof(char)*N);     string2 = (char *)malloc(sizeof(char)*N); 	//可以注释掉这句话     //string3 = (char *)malloc(sizeof(char)*N);     printf("请输入字符串1：");     gets(string1);     printf("请输入字符串2：");     gets(string2); 	//string3 指向了join1中 temp变量的地址，不再是由malloc返回的地址 	//在C，c++中 free只能对由malloc函数返回的变量进行操作 	//这也就是为什么 在 之后的free（string3）会报错的原因 	//事实上这里的sring3 可以不需要malloc分配空间，因为分配的空间，你并没有使用  	//注意这里传入string1和string2并不会改变两个实参中的地址，在下面free是不会有问题 	//因为在这里join1都是拷贝了实参的值，是join1函数中string1和string2都是实参的拷贝     string3 = join1(string1,string2);     printf("%s\n",string3);    	//在这里调用free没有问题 	free(string2); 	free(string1);      string3 = NULL; 	system("pause");          return 0; }   是的，join函数里面string1和string2是作为指针的值参传入的，在函数体里面加减不影响返回后string1和string2，如果对指针指向的内容修改会影响到返回后的主程序。因此可以free。

user: user-4
content: 你试图free一个static char[]

user: user-5
content: string3 = join1(string1,string2); 你的string3已经指向了新的内存地址，而不是你malloc得到的了，free自然出错