user-0 提问: malloc和free的问题

回复:
user: user-1
content: 要不结帖吧,看上去,xihu1364,好像解决了你的问题了 不过,你的表述,和代码 我确实没看懂. 不知道你的实际需求

user: user-2
content: 结贴吧  没有什么好讨论的  使用 itoa就解决了额  想明白原理就看我贴的代码

user: user-0
content: 引用 9 楼 xihu1364 的回复:     #include <stdio.h>       //反转字符串       char *reverse(char *s)       {           char temp;           char *p = s;    //p指向s的头部           char *q = s;    //q指向s的尾部           while(*q)               ++q;           q--;                  //交换移动指针，直到p和q交叉           while(q > p)           {               temp = *p;               *p++ = *q;               *q-- = temp;           }           return s;       }              /*       * 功能：整数转换为字符串       * char s[] 的作用是存储整数的每一位       */       char *my_itoa(int n)       {           int i = 0,isNegative = 0;           static char s[100];      //必须为static变量，或者是全局变量           if((isNegative = n) < 0) //如果是负数，先转为正数           {               n = -n;           }           do      //从各位开始变为字符，直到最高位，最后应该反转           {               s[i++] = n%10 + '0';               n = n/10;           }while(n > 0);                  if(isNegative < 0)   //如果是负数，补上负号           {               s[i++] = '-';           }           s[i] = '\0';    //最后加上字符串结束符           return reverse(s);         }              int main(void)       {           int m;           printf("请输入int型整数m：");           scanf("%d",&m);           printf("整数=%d,字符串=%s\n",m,my_itoa(m));           return 0;       }    我写的这个跟你贴的这个函数，有一点不一样。如下： 写一个把10进制整数转化为16进制，10进制，8进制字符串的函数  函数原形如下： void int_to_str(int value,char *buff,int flag)；value 为整数变量 ，buff 为字符串指针，flag 用来表示8，10，16进制 。 你贴的：  while(q > p)           {               temp = *p;               *p++ = *q;               *q-- = temp;           }   前提是内存区已经有数据了。

user: user-0
content: 引用 16 楼 xihu1364 的回复:PTR=(char*)malloc(sizeof(i+1));  ...大神，鉴定完毕！我心里想的是i+1，sizeof竟然无意识的敲出来了。。。谢谢你！

user: user-2
content: 知道改吧  改成 PTR=(char*)malloc(i+1);

user: user-2
content: PTR=(char*)malloc(sizeof(i+1));  ...

user: user-0
content: #include <stdio.h> #include <stdlib.h>  //我感觉必须要用到全局变量，因为void int_to_str(int value,char *buff,int flag)的限制性有两个：不能有返回值；不能使用二级指针。 //要想申请的malloc函数内存不产生泄露，我能想到的办法只有全局变量了。 char* PTR; #define MAX_SIZE 100  void int_to_str(int value,char *buff,int flag){ 	char a[MAX_SIZE]={0};//这个数组是逐步跟随a[i]=value%flag;语句进行接收转换后的进制数。不会用动态数组，MAX_SIZE就挺好的。 	int i=0; 	char* ptrEnd=NULL;  	while(value){//逐步求解进制数 		a[i]=value%flag; 		value=value/flag; 		i++; 	} 	PTR=(char*)malloc(sizeof(i+1));//动态申请内存空间，大小是i+1。这个1是为截止符留的空间。 	ptrEnd=PTR; //先让ptrEnd指向内存区的首地址，为下面的复制数据做好准备。 	while(i){   //此时第一次循环的i是前面累加后的i值，不是0。 		*ptrEnd=a[i-1]; 		ptrEnd++; 		i--; 	} 	*ptrEnd='#';//此时数据复制完毕，以#为截止符，不能用'\0',因为这个0 跟数字里的0等同。  	free(PTR);//。这个函数用来释放动态申请的内存。 	PTR=NULL;// }  int main(void) {     int value=100; 	char* buff=NULL; 	int flag=2; 	 	int_to_str(value,buff,flag);  	while(*PTR!='#'){ 		printf("%d",*PTR); 		PTR++; 	} 	printf("\n");  	 	return 0 ; }

user: user-0
content: 引用 12 楼 xihu1364 的回复:图片   我还一个一个去敲怎么贴代码？就像刚才你那样

user: user-0
content: #include <stdio.h> #include <stdlib.h>  //我感觉必须要用到全局变量，因为void int_to_str(int value,char *buff,int flag)的限制性有两个：不能有返回值；不能使用二级指针。 //要想申请的malloc函数内存不产生泄露，我能想到的办法只有全局变量了。 char* PTR; #define MAX_SIZE 100  void int_to_str(int value,char *buff,int flag){ 	char a[MAX_SIZE]={0};//这个数组是逐步跟随a[i]=value%flag;语句进行接收转换后的进制数。不会用动态数组，MAX_SIZE就挺好的。 	int i=0; 	char* ptrEnd=NULL;  	while(value){//逐步求解进制数 		a[i]=value%flag; 		value=value/flag; 		i++; 	} 	PTR=(char*)malloc(sizeof(i+1));//动态申请内存空间，大小是i+1。这个1是为截止符留的空间。 	ptrEnd=PTR; //先让ptrEnd指向内存区的首地址，为下面的复制数据做好准备。 	while(i){   //此时第一次循环的i是前面累加后的i值，不是0。 		*ptrEnd=a[i-1]; 		ptrEnd++; 		i--; 	} 	*ptrEnd='#';//此时数据复制完毕，以#为截止符，不能用'\0',因为这个0 跟数字里的0等同。  	free(PTR);//。这个函数用来释放动态申请的内存。 	PTR=NULL;// }  int main(void) {     int value=100; 	char* buff=NULL; 	int flag=2; 	 	int_to_str(value,buff,flag);  	while(*PTR!='#'){ 		printf("%d",*PTR); 		PTR++; 	} 	printf("\n");  	 	return 0 ; }

user: user-2
content: 图片   我还一个一个去敲

user: user-0
content: #include <stdio.h> #include <stdlib.h>  //我感觉必须要用到全局变量，因为void int_to_str(int value,char *buff,int flag)的限制性有两个：不能有返回值；不能使用二级指针。 //要想申请的malloc函数内存不产生泄露，我能想到的办法只有全局变量了。 char* PTR; #define MAX_SIZE 100  void int_to_str(int value,char *buff,int flag){ 	char a[MAX_SIZE]={0};//这个数组是逐步跟随a[i]=value%flag;语句进行接收转换后的进制数。不会用动态数组，MAX_SIZE就挺好的。 	int i=0; 	char* ptrEnd=NULL;  	while(value){//逐步求解进制数 		a[i]=value%flag; 		value=value/flag; 		i++; 	} 	PTR=(char*)malloc(sizeof(i+1));//动态申请内存空间，大小是i+1。这个1是为截止符留的空间。 	ptrEnd=PTR; //先让ptrEnd指向内存区的首地址，为下面的复制数据做好准备。 	while(i){   //此时第一次循环的i是前面累加后的i值，不是0。 		*ptrEnd=a[i-1]; 		ptrEnd++; 		i--; 	} 	*ptrEnd='#';//此时数据复制完毕，以#为截止符，不能用'\0',因为这个0 跟数字里的0等同。  	free(PTR);//。这个函数用来释放动态申请的内存。 	PTR=NULL;// }  int main(void) {     int value=100; 	char* buff=NULL; 	int flag=2; 	 	int_to_str(value,buff,flag);  	while(*PTR!='#'){ 		printf("%d",*PTR); 		PTR++; 	} 	printf("\n");  	 	return 0 ; }

user: user-0
content: 引用 7 楼 xihu1364 的回复:把测试代码贴上 我去调调贴上来啦，大神！

user: user-2
content: #include <stdio.h>       //反转字符串       char *reverse(char *s)       {           char temp;           char *p = s;    //p指向s的头部           char *q = s;    //q指向s的尾部           while(*q)               ++q;           q--;                  //交换移动指针，直到p和q交叉           while(q > p)           {               temp = *p;               *p++ = *q;               *q-- = temp;           }           return s;       }              /*       * 功能：整数转换为字符串       * char s[] 的作用是存储整数的每一位       */       char *my_itoa(int n)       {           int i = 0,isNegative = 0;           static char s[100];      //必须为static变量，或者是全局变量           if((isNegative = n) < 0) //如果是负数，先转为正数           {               n = -n;           }           do      //从各位开始变为字符，直到最高位，最后应该反转           {               s[i++] = n%10 + '0';               n = n/10;           }while(n > 0);                  if(isNegative < 0)   //如果是负数，补上负号           {               s[i++] = '-';           }           s[i] = '\0';    //最后加上字符串结束符           return reverse(s);         }              int main(void)       {           int m;           printf("请输入int型整数m：");           scanf("%d",&m);           printf("整数=%d,字符串=%s\n",m,my_itoa(m));           return 0;       }

user: user-0

user: user-2
content: 把测试代码贴上 我去调调

user: user-0
content: 引用 4 楼 xihu1364 的回复:上面知道保存 首地址，打印的时候居然不记得  我一开始是把打印数据放在了main函数里，刚才收一抖放在这个函数里了。 即使放在main函数还是有问题。

user: user-0
content: 引用 3 楼 xihu1364 的回复:*ptrEnd='#';//此时数据复制完毕，以#为截止符，不能用'\0',因为这个0 跟数字里的0等同。 while(*PTR!='#'){ printf("%d",*PTR); PTR++; } printf("\n");  free(PTR);//问题就出在这一句上；  红色地方就是你的问题所在，都移动了指针，free肯定出问题  是的，如果我把 while(*PTR!='#'){ printf("%d",*PTR); PTR++; } printf("\n"); 这些删除了还是有问题。

user: user-2
content: 上面知道保存 首地址，打印的时候居然不记得

user: user-2
content: *ptrEnd='#';//此时数据复制完毕，以#为截止符，不能用'\0',因为这个0 跟数字里的0等同。 while(*PTR!='#'){ printf("%d",*PTR); PTR++; } printf("\n");  free(PTR);//问题就出在这一句上；  红色地方就是你的问题所在，都移动了指针，free肯定出问题

user: user-0
content: 引用 1 楼 u012683733 的回复:函数的功能是进行进制的转换 并且将转换后的值作为一个字符串。