从函数返回一个字符数组打印垃圾值但在函数中打印正常?

时间:2014-03-24 18:23:23

标签: c arrays function

#include<stdio.h>
#include <string.h>
char *generate(char a[],int s,int e,char r[])
{
    if(s>e){
        printf("%s\n ",r); //Prints the correct value "rempD" here
        return r;
    }
    int i,asci[128]={0};
    for(i=s;i<=e;i++)
        if(asci[a[i]]==1)
            break;
        else
            asci[a[i]]=1;
    char t[i-s];
    t[i-s]='\0';
    for(i=i-1;i>=s;i--)
        t[i-s]=a[i];
    if(r==0||strlen(t)>strlen(r))
        return generate(a,s+1,e,t);
    else
        return generate(a,s+1,e,r);

}
int main()
{
    char a[]="prrempD";
    printf("Largest unique string:\n%s",generate(a,0,strlen(a)-1,NULL)); // But prints a garbage value here
}

此函数用于返回字符串中最大的唯一子字符串。 返回字符数组时,它返回一个垃圾值。

2 个答案:

答案 0 :(得分:3)

char t[i-s];已在堆栈上分配,并在您从generate()返回时被取消分配。

如果你希望它超出对generate()的调用,你必须使用堆或其他一些分配方法。

答案 1 :(得分:0)

它基本归结为返回指向局部变量的指针。

generate将返回其第四个参数r,在调用generate(a,s+1,e,t)之后,它意味着您返回一个局部变量。离开函数后,此局部变量的内容无效。您需要传入缓冲区以将结果复制到,或者分配副本(通过malloc或其他方式)并返回该指针。