C 为什么我没有从函数中得到任何值?

C 为什么我没有从函数中得到任何值?,c,string,reversing,C,String,Reversing,你能告诉我为什么我不能从下面的函数中得到任何值吗 #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;

你能告诉我为什么我不能从下面的函数中得到任何值吗

#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;
}
#包括
#包括
类型定义结构{
无符号整数长度;
字符*数据;
}弦;
字符串反转(字符串为this){
把它串起来;
那=这个;
int i,j;
j=该长度-1;
char myc[that.length+1];
对于(i=0;i

//reverse函数应该返回一个反转的字符串,但在
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!!

(并在不再需要时释放它)

代码不好,我相信问题是您正在使用g++进行编译,因为您有“this”关键字。使用GCC编译,然后“this”将不是关键字而是标识符。C++是OOP,这就是为什么“这个”是关键字。
然而,其他评论提到了一个问题,那个就是“this.data=myc”。数组“myc”是在作用域而不是堆上声明的,因此它具有未定义的行为,并且在堆栈更改时可能指向完全不同的内容。在堆上或全局范围内创建数组。

char myc[that.length+1]已分配给结构的一个成员,但这是本地内存。改为使用strdup
。@EugeneSh<代码>这不是问题。结构被复制。问题是当地的弗拉。忽略了结构而不是数组的要点。按值传递结构通常不是一个好主意。作为指针传递并应用常量正确性。在函数
reverse
中,赋值
that.data=myc
是一个错误,一旦超出函数范围,可能会导致未定义的行为,因为
myc
是一个本地数组,因此在该函数范围之外不可行。为什么称代码为“fine”然后写道代码有一个严重的bug?如果不称之为“罚款”,那将是对有bug代码的一种歧视!我说的很好,意思是代码有效。这就是为什么我在下面澄清,其他人指出的问题是一个必须解决的问题,因为它的未定义行为。留着你的钱,我不明白。你说:“我说的很好,意思是代码可以工作”你怎么能说没有定义行为的代码可以工作?抱歉,这没有意义。然后删除它!带有UB的代码永远不会“好”——它永远不会“工作”。这就是UB的全部——没人知道会发生什么。它可能在一个系统上做了它应该做的事情,而在另一个系统上完全失败。
char *myc = malloc(that.length+1);