你能告诉我为什么我从下面的功能中得不到任何价值吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned int length ;
char * data ;
} String ;
String reverse(String this){
String that;
that=this;
int i,j;
j=that.length-1;
char myc[that.length+1];
for(i=0; i < that.length; i++, j--) {
myc[i]=that.data[j];
}
myc[i+1]='\0';
that.data= myc ;
return that;
}
int main()
{
String myStr;
String myStrA;
myStr.data= "This one is beautiful";
myStr.length=21;
String myStr2= reverse(myStr);
printf("\n\nmy text before reverse : %s \n", myStr.data);
printf("\n\nmy text after reverse : %s \n", myStr2.data);
return 0;
}
//反向函数应该返回一个反向字符串,但它不是
答案 0 :(得分:2)
reverse
中的
char myc[that.length+1];
for(i=0; i < that.length; i++, j--) {
myc[i]=that.data[j];
}
myc[i+1]='\0';
that.data= myc ; // <=== NO!!
您将本地VLA 分配给您的返回值,从而隐藏了“返回本地数组”警告(运气不好),如果您直接返回该数组,则会收到该警告。
因此,一旦函数返回就会丢失该值,因为它超出了范围,并且程序重用了内存(未定义的行为)。
因此,您应该复制数据,以便使用that.data = strdup(myc)
;
甚至更好:不要创建VLA但直接分配,这会保存副本,您现在可以安全地分配myc
:
char *myc = malloc(that.length+1);
(并在不再需要时释放它)
答案 1 :(得分:-4)
代码不对,我相信问题是你正在使用g ++进行编译,因为你有“this”关键字。使用GCC编译然后“this”将不是关键字而是标识符。 C ++是OOP,这就是“this”是关键字的原因。
然而,其他评论提到了一个问题,那就是“this.data = myc”。数组“myc”在范围而不是堆上声明,因此它具有未定义的行为,并且在堆栈更改时可能指向完全不同的内容。在堆上创建数组,而不是在全局范围内创建数组。