char指针函数返回函数内部的字符串,但不返回main?
为什么stringParser中的t值打印“Hello”,而不打印主函数中的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
#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()
的字符串必须小于100char
s。你需要更好地记录这一点,检查字符串是否太长,或者动态创建数组,使其足够大以容纳给定字符串。@neostar退出函数后,返回的指针无效,因为作为具有自动存储持续时间的函数的局部变量的指针数组不活动。@Carcigenicate t是指向字符串temp的指针因此函数stringParser()应该返回该指针。stringParser中的指针不应该包含字符串temp的值吗?请看。@neostar函数调用结束后,函数中的所有局部变量都将被销毁,这里的变量temp将被销毁,因此您的函数返回一个指向temp地址但temp值已被销毁的指针。temp的值可能是重复的?