读书人

c 语言 free 出断异常 高手指教

发布时间: 2012-02-13 17:20:26 作者: rapoo

c 语言 free 出断错误 高手指教
这是一道C笔试题 各位大大不要问为什么要返回指针 这个我也不知道 .... 题上给的函数原型是这样的~
使用malloc 函数申请空间后 free 释放时断错误了 不解... 各位大大给看看

/*
* 字符串逆序 使用inerchar 函数将字符串前后颠倒后 返回一个指针 (题上要求)
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * inerchar(char *str)
{
int len = 0, i = 0;
char *strl = str; // 用于逆序 -- 字符串的一半
char *strr = str; // 用于逆序 -- 字符串的另一半
char temp;
char *result = (char *)malloc(strlen(str) + 1);

len = strlen(strl);
for (i; i < (len / 2); i++) // 开始将字符串前后颠倒
{
temp = strl[len - i - 1];
strl[len - i - 1] = strr[i];
strr[i] = temp;
}
result = strr;

return result;

}
int main(void)
{
char str[] = {"Hello world"};
char *p = inerchar(str);

printf("inver string : %s \n", p);

free(p); // 此处断错误 不解 .... 莫非 free 只能释放一个函数体内申请的空间?
p = NULL;

return 0;
}


[解决办法]

C/C++ code
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * inerchar(char *str)
{
int len = 0, i = 0;
char *strl = str; // 用于逆序 -- 字符串的一半
char *strr = str; // 用于逆序 -- 字符串的另一半
char temp;
char *result = (char *)malloc(strlen(str) + 1);

len = strlen(strl);
for (i; i < (len / 2); i++) // 开始将字符串前后颠倒
{
temp = strl[len - i - 1];
strl[len - i - 1] = strr[i];
strr[i] = temp;
}
result = strr; // mark strcpy(result, strr);

return result;

}
int main(void)
{
char str[] = {"Hello world"};
char *p = inerchar(str);

printf("inver string : %s \n", p);

free(p); // 此处断错误 不解 .... 莫非 free 只能释放一个函数体内申请的空间?
p = NULL;

return 0;
}


没仔细看,应该是这里的问题
[解决办法]
C/C++ code
char * inerchar(char *str){      int len = 0, i = 0;      char *strl = str; // 用于逆序 -- 字符串的一半      char *strr = str; // 用于逆序 -- 字符串的另一半      char temp;      char *result = (char *)malloc(strlen(str) + 1);      len = strlen(strl);      for (i; i < (len / 2); i++) // 开始将字符串前后颠倒      {          temp = strl[len - i - 1];          strl[len - i - 1] = strr[i];          strr[i] = temp;      }      /*result = strr;*/ /*问题应该在这里,strr是指向形参,形参为数组,赋值后改变了result的指向,即result此后指向的地址不是malloc分配的内存,而是传入的参数数组,free()函数释放数组空间,所以报断错误。ps:这段代码还有内存泄露的危险.*/    strcpy(result, strr);      return result;} 

读书人网 >C语言

热点推荐