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;
}
[解决办法]
#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;
}
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;}