首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-13 
c 语言 free 出断错误 高手指教这是一道C笔试题 各位大大不要问为什么要返回指针 这个我也不知道 .... 题

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;} 

热点排行
Bad Request.