为什么我没有从功能中获得任何价值?

问题描述 投票:0回答:2

你能否告诉我为什么我没有从下面的功能中获得任何价值?

#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;
}

//反向函数应该返回一个反向字符串,但它没有

c string reversing
2个回答
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);

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


-4
投票

代码不是很好,我相信问题是你正在使用g ++进行编译,因为你有“this”关键字。使用GCC编译然后“this”将不是关键字而是标识符。 C ++是OOP,这就是“this”是关键字的原因。

然而,其他评论提到了一个问题,那就是“this.data = myc”。数组“myc”在范围而不是堆上声明,因此它具有未定义的行为,并且在堆栈更改时可能指向完全不同的内容。在堆上创建数组,而不是在全局范围内创建数组。

© www.soinside.com 2019 - 2024. All rights reserved.