在C中反转字符串 #包括 #包括 #包括 char*str_rev(char s[]{ 静态字符*st=NULL; 静态字符*l; int i=0,c=0; st=malloc((strlen)*sizeof(*s))+1; *l=st; 如果(s==NULL){ 返回“无效参数”; } 对于(i=0;s[i]!='\0';i++){ ; } 对于(c=i;c>=0;c--){ *l++=s[c]; } l='\0'; 返回st; } int main(){ 字符a[]=“Angus Declan R”; printf(“\n%s\n”,str_rev(a)); 返回0; }

在C中反转字符串 #包括 #包括 #包括 char*str_rev(char s[]{ 静态字符*st=NULL; 静态字符*l; int i=0,c=0; st=malloc((strlen)*sizeof(*s))+1; *l=st; 如果(s==NULL){ 返回“无效参数”; } 对于(i=0;s[i]!='\0';i++){ ; } 对于(c=i;c>=0;c--){ *l++=s[c]; } l='\0'; 返回st; } int main(){ 字符a[]=“Angus Declan R”; printf(“\n%s\n”,str_rev(a)); 返回0; },c,C,如何释放使用func str_rev()中的malloc()分配的内存,因为我需要重新运行反向字符串。(1):由于以下原因,l中的第一个内存是\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

如何释放使用func str_rev()中的malloc()分配的内存,因为我需要重新运行反向字符串。

(1):由于以下原因,
l
中的第一个内存是
\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;
}
s[i]
变为
\0
,您分配
c=i
,然后在第二个循环中,您在
l
的第一个点分配
\0

for(i=0;s[i]!='\0';i++){
 ;
 }
返回
返回ll
\0
中的第一个位置 因此,在带有
%s

for(c=i;c >=0;c--){
  *l++ = s[c];  // you are assigning `\0` for first time
 }
不打印任何内容

建议:

printf("\n %s \n",str_rev(a));    
(2):问题代码中至少有两个编译错误。你忘了
在两个位置上

for(c=i-1;c >=0;c--){
     // ^ c should be i-1 initially 
  *l++ = s[c];
 }
下一个

第三个严重错误

printf("\n %s \n",str_rev(a));    
您返回的内存地址无效
您要做的是,在
st
中分配内存,然后分配给
l
,然后
free(st)
并返回
l
:(阅读注释)

建议:您是否使用
l
并返回
st
而不调用free()

(4)

这不是错误,但为什么会出现这种无用的循环

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 
(5):在
l

while(c > 0){
  l--;
  c--;
 }
(1):由于以下原因,
l
中的第一个内存是
\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;
}
s[i]
变为
\0
,您分配
c=i
,然后在第二个循环中,您在
l
的第一个点分配
\0

for(i=0;s[i]!='\0';i++){
 ;
 }
返回
返回ll
\0
中的第一个位置 因此,在带有
%s

for(c=i;c >=0;c--){
  *l++ = s[c];  // you are assigning `\0` for first time
 }
不打印任何内容

建议:

printf("\n %s \n",str_rev(a));    
(2):问题代码中至少有两个编译错误。你忘了
在两个位置上

for(c=i-1;c >=0;c--){
     // ^ c should be i-1 initially 
  *l++ = s[c];
 }
下一个

第三个严重错误

printf("\n %s \n",str_rev(a));    
您返回的内存地址无效
您要做的是,在
st
中分配内存,然后分配给
l
,然后
free(st)
并返回
l
:(阅读注释)

建议:您是否使用
l
并返回
st
而不调用free()

(4)

这不是错误,但为什么会出现这种无用的循环

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 
(5):在
l

while(c > 0){
  l--;
  c--;
 }


这是你真正的密码吗?它无法编译。请用一个问题陈述和几句话来解释您的解决方法,以改进您的问题。@nm:是的,这是我真正的代码。它正在编译,但字符串没有按相反的顺序打印。您使用的编译器是什么?代码不是有效的C,两处缺少分号。这是您的真实代码吗?它无法编译。请用一个问题陈述和几句话来解释您的解决方法,以改进您的问题。@nm:是的,这是我真正的代码。它正在编译,但字符串没有按相反的顺序打印。您使用的编译器是什么?代码不是有效的C,它在两个地方缺少分号。@Angus它不正确。在发布问题之前,你应该尽全力。。如果您有任何疑问,请告诉我。@Angus没问题,准备好,再试一次。我已经给出了足够的分数,我认为您可以更正您的代码。谢谢。您给了改进编码的希望,而不是指责编码不好。我将在下一篇文章中改进我的编码。@Angus是的,这没什么大不了的。我刚刚通过了我大学的C-grad考试。你只需要读一本书,解决每一章后面给出的每一个练习。才7天task@Angus再次阅读我的答案,我对所有评论做了一些更改。你只犯了容易改进的错误。从算法上讲,确实没有问题。@Angus,这是不正确的。在发布问题之前,你应该尽全力。。如果您有任何疑问,请告诉我。@Angus没问题,准备好,再试一次。我已经给出了足够的分数,我认为您可以更正您的代码。谢谢。您给了改进编码的希望,而不是指责编码不好。我将在下一篇文章中改进我的编码。@Angus是的,这没什么大不了的。我刚刚通过了我大学的C-grad考试。你只需要读一本书,解决每一章后面给出的每一个练习。才7天task@Angus再次阅读我的答案,我对所有评论做了一些更改。你只犯了容易改进的错误。在算法方面确实没有问题。