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

时间:2011-12-05 14:48:12

标签: c

我在这里找到了类似的问题和解决方案 - 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使用的内存不会丢失?

谢谢。

2 个答案:

答案 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;

然后你会复制那里的价值并尝试将其归还你会遇到问题