我正在尝试创建一个反转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
,但对我来说,没有打印出来。有谁知道我搞砸了哪里?
答案 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系统上,您的代码示例应该可行。这是一个坏主意,但是因为你已经从堆栈中返回了内存,这基本上不是你的内存使用而且是不稳定的。通常,您可以立即将返回值复制到已分配的本地内存。如果可以的话,我建议你传递你想要答案的目的地,或者只是返回分配的内存。