char指针函数返回函数内部的字符串,但不返回main?

char指针函数返回函数内部的字符串,但不返回main?,c,pointers,char,C,Pointers,Char,为什么stringParser中的t值打印“Hello”,而不打印主函数中的 #include <stdio.h> char* stringParser(char st[]) { char temp[100]; int i = 0; while (st[i] != '\0') { temp[i] = st[i]; i++; } temp[i] = '\0'; char* t = temp; pr

为什么stringParser中的t值打印“Hello”,而不打印主函数中的

#include <stdio.h>

char* stringParser(char st[]) {
    char temp[100];
    int i = 0;
    while (st[i] != '\0') {
        temp[i] = st[i];
        i++;
    }
    temp[i] = '\0';
    char* t = temp;
    printf("%s", t);  
    return t;                // Outputs: "Hello"
}

int main() {
    char y[] = "Hello"; 
    printf("\n%s", stringParser(y));   //Outputs: "╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠⌠²Ö"
    return 0;
}
#包括
char*stringParser(char st[]{
炭温度[100];
int i=0;
而(st[i]!='\0'){
温度[i]=st[i];
i++;
}
温度[i]='\0';
char*t=温度;
printf(“%s”,t);
返回t;//输出:“Hello”
}
int main(){
char y[]=“你好”;
printf(“\n%s”,stringParser(y));//输出:╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠⌠²Ö"
返回0;
}

数组
temp
仅存在于函数
stringParser()
的范围内。指针
t
指向数组
temp
,或者换句话说
t
保存存储
temp
的地址。从函数
stringParser()
返回时,数组
temp
不再存在,访问它会导致未定义行为(UB)。返回指向
temp
的指针
t
,并将其交给
printf()
printf()

有多种方法可以避免UB:

  • 使阵列
    temp
    静态
    。但这在多线程程序中不起作用,应该在库中避免
  • 使用动态内存分配,使用
    malloc()
    calloc()
    temp
    -数组保留存储空间,但在不再需要内存后,您必须再次
    free()
  • main()
    中声明数组,并将指向它的指针传递到
    stringParser()
    ,但要检查大小,确保不会出现缓冲区溢出

非主题:
size\u t
是一种更好的数组索引类型,因为它保证足够大以容纳所有可能的索引,并且
size\u t
是无符号的。您的程序很容易因将来的更改而导致缓冲区溢出。因为您没有记录给
stringParser()
的字符串必须小于100
char
s。你需要更好地记录这一点,检查字符串是否太长,或者动态创建数组,使其足够大以容纳给定字符串。

@neostar退出函数后,返回的指针无效,因为作为具有自动存储持续时间的函数的局部变量的指针数组不活动。@Carcigenicate t是指向字符串temp的指针因此函数stringParser()应该返回该指针。stringParser中的指针不应该包含字符串temp的值吗?请看。@neostar函数调用结束后,函数中的所有局部变量都将被销毁,这里的变量temp将被销毁,因此您的函数返回一个指向temp地址但temp值已被销毁的指针。temp的值可能是重复的?