#include<stdio.h>
#include<string.h>
#include<malloc.h>
char *str_rev(char s[]){
static char *st = NULL;
static char *l;
int i = 0,c = 0;
st = malloc((strlen(s) * sizeof(*s))+1);
*l = st;
if(s == NULL){
return "INVALID PARAMS";
}
for(i=0;s[i]!='\0';i++){
;
}
for(c=i;c >=0;c--){
*l++ = s[c];
}
l = '\0';
return st;
}
int main(){
char a[]="Angus Declan R";
printf("\n %s \n",str_rev(a));
return 0;
}
如何在func str_rev()中释放使用malloc()分配的内存,因为我需要重新调整反向字符串。
答案 0 :(得分:5)
(1): l
中的第一个内存是\0
,原因如下:无法打印的原因:
循环后
for(i=0;s[i]!='\0';i++){
;
}
s[i]
成为\0
并指定c=i
,然后在\0
中的第一个点分配l
之后的第二个循环中。
for(c=i;c >=0;c--){
*l++ = s[c]; // you are assigning `\0` for first time
}
您返回return l;
,l
\0
的第一个位置就是如此
所以在带有%s
printf("\n %s \n",str_rev(a));
什么都不打印。
建议:
for(c=i-1;c >=0;c--){
// ^ c should be i-1 initially
*l++ = s[c];
}
(2):问题代码中有两个编译错误 - 至少。你在两个职位上忘了;
return "INVALID PARAMS";
^
下一个
char a[]="Angus Declan R";
^
第三次严重错误
您返回的内存地址无效!
你正在做什么,在st
分配内存,然后分配给l
,然后分配free(st)
并返回l
:( 阅读评论)
st = malloc((strlen(s) * sizeof(*s))+1); // allocation
l = st; // assign to l
// code in between
free(st); // st and l become invalid after free
return l; // returning invalid memory
建议:您是否使用l
进行工作并返回st
而不调用free()。
(4):
这不是错误,但为什么这个无用的循环呢?
while(c > 0){
l--;
c--;
}
(5):忘记l
for(c=i;c >=0;c--){
*l++ = s[c];
}
l = '\0';
^ forgot * it should be *l = '\0';