从C中的函数返回一个局部变量

iht*_*tus 1 c

我在这里找到了一个类似的问题和解决方案 - 从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;
}
Run Code Online (Sandbox Code Playgroud)

输出:myvar = [Lorem]

这段代码是否正确?由于功能范围,vars使用的内存不会丢失?

谢谢.

unw*_*ind 9

字符串文字是静态的,即用于保存字符的内存Lorem不用于在程序的持续时间内保存任何其他内容.因此,将地址返回到这样的字符串是安全的.

这和做的一样

const char* myfunction(void)
{
  return "Lorem";
}
Run Code Online (Sandbox Code Playgroud)

这是完全正常和常见的事情,例如将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";
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样的代码通常(在实践中)通过使用宏来实现case语句更加难以阅读.