我在这里找到了类似的问题和解决方案 - returning a local variable from function in C
但是针对同样的问题提出了另一个解决方案,并想请你评估它,它是否正确?
int myfunction (char **returnval) {
int isvalue = 0;
char *d;
d = "Lorem";
*returnval = d;
return isvalue;
}
int main(int argc, char **argv) {
int func_return;
char *myvar;
func_return = myfunction(&myvar);
printf("myvar=[%s]\n", myvar);
return 0;
}
输出:myvar = [Lorem]
该代码是否正确?由于函数范围,vars使用的内存不会丢失?
谢谢。
答案 0 :(得分:9)
字符串文字是静态的,即用于保存字符Lorem
的内存不用于在程序的持续时间内保存任何其他内容。因此,将地址返回到这样的字符串是安全的。
这与做
相同const char* myfunction(void)
{
return "Lorem";
}
这是完全正常的,也是常见的事情,例如将enum
值映射到符号字符串时:
typedef enum { Error_FileNotFound, Error_OutOfMemory, Error_PrinterOnFire } ErrorCode;
const char * error_code_to_string(ErrorCode error)
{
switch(errorCode)
{
case Error_FileNotFound:
return "Error_FileNotFound";
case Error_OutOfMemory:
return "Error_OutOfMemory";
case Error_PrinterOnFire:
return "Error_PrinterOnFire";
return "Unknown error";
}
}
这样的代码通常(在实践中)通过使用宏来实现case
语句使其更加干燥而更难阅读。
答案 1 :(得分:2)
“Lorem”是静态的。正如你所看到的,你从未在代码中定义过他。
如果你愿意的话:
char[6] d;
然后你会复制那里的价值并尝试将其归还你会遇到问题