在C中反转字符串

时间:2013-03-09 19:04:00

标签: c

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

1 个答案:

答案 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语句中
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';