字符串反转功能不起作用

时间:2014-08-14 04:27:08

标签: c string

我正在尝试创建一个反转char *的函数。这就是我到目前为止所做的:

#include <stdio.h>
#include <string.h>

char *reverse(char *x) {
     int len = strlen(x);
     char ans[len+1];
     int i;
     for (i = 0; i < len; i++) {
          ans[i] = x[len-i-1];
     }
     ans[i] = '\0';
     return ans;
}

int main() {
     char *a = reverse("hello");
     printf("%s\n", a);
}

它应该打印olleh,但对我来说,没有打印出来。有谁知道我搞砸了哪里?

3 个答案:

答案 0 :(得分:2)

您正在返回ans,它是指向调用reverse()时驻留在堆栈中的字符数组的指针。

reverse()返回后,会弹出其堆栈帧。因此,当您尝试将其打印出来时,ans中存储的内存地址的内容没有很好地定义。

要解决此问题,您可以使用malloc

来使用堆内存
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *reverse(char *x) {
     int len = strlen(x);
     char *ans = malloc((len+1)*sizeof(char));
     int i;
     for (i = 0; i < len; i++) {
          ans[i] = x[len-i-1];
     }
     ans[i] = '\0';
     return ans;
}

int main() {
     char *a = reverse("hello");
     printf("%s\n", a);
     free(a);
}

在这种情况下reverse()返回时,ans将继续指向堆中的char数组。只需记住在使用free()完成数组后释放数组。

答案 1 :(得分:1)

 char ans[len+1];

从函数返回后,上面的char数组的内容将不再可用。上面数组的内存在堆栈上。尝试使用malloc/calloc动态分配内存。

例如:

 char *ans = malloc(len+1); //Note: Sizeof char is always 1.

答案 2 :(得分:-1)

我不确定您想要完成什么,但在unix系统上,您的代码示例应该可行。这是一个坏主意,但是因为你已经从堆栈中返回了内存,这基本上不是你的内存使用而且是不稳定的。通常,您可以立即将返回值复制到已分配的本地内存。如果可以的话,我建议你传递你想要答案的目的地,或者只是返回分配的内存。