0
#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() 分配的内存,因为我需要重新运行反转的字符串。

4

1 回答 1

5

(1):第一次记忆l\0由于以下原因,这是什么都不打印的原因:

在你的循环之后

for(i=0;s[i]!='\0';i++){
 ;
 }

s[i]成为 \0并且您c=i在第二个循环中分配,然后您\0l.

for(c=i;c >=0;c--){
  *l++ = s[c];  // you are assigning `\0` for first time
 }

你返回return l;并且在第一个位置l \0是这样所以在 printf 语句中%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 

建议:您是否在不调用 free() 的情况下 使用l并返回。st

(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';
于 2013-03-09T19:15:47.973 回答