c - 返回指向静态局部变量的指针安全吗?

标签 c static

我正在处理一些代码,这些代码广泛使用返回指向静态局部变量的指针的习惯用法。例如:

char* const GetString()
{
  static char sTest[5];
  strcpy(sTest, "Test");
  return sTest;
}

我认为这是安全的吗?

PS,我知道这是做同样事情的更好方法:

char* const GetString()
{
  return "Test";
}

编辑: 抱歉,函数签名当然应该是:

const char* GetString();

最佳答案

第一个例子:比较安全

char* const GetString()
{
  static char sTest[5];
  strcpy(sTest, "Test");
  return sTest;
}

虽然不推荐,但这是安全的,即使函数作用域结束,静态变量的作用域仍然有效。这个函数根本不是线程安全的。一个更好的函数会让您为 GetString() 函数传递一个 char* buffer 和一个 maxsize 来填充。

特别是,此函数不被视为可重入函数,因为可重入函数不得将地址返回到静态(全局)非常量数据 .参见 reentrant functions .

第二个例子:完全不安全

char* const GetString()
{
  return "Test";
}

如果您执行 const char *,这将是安全的。 你给的东西不安全。原因是因为字符串文字可以存储在只读内存段中,允许修改它们会导致未定义的结果。

char* const(常量指针)表示您不能更改指针指向的地址。 const char *(指向 const 的指针)意味着您无法更改此指针指向的元素。

结论:

您应该考虑:

1) 如果您有权访问代码,则修改 GetString 以获取要填充的 char* buffer 参数和 maxsize 使用。

2) 如果您无权访问代码,但必须调用它,请将此方法包装在另一个受互斥锁保护的函数中。新方法如1所述。

关于c - 返回指向静态局部变量的指针安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/453696/

相关文章:

c - 在 [min,max] 范围内生成随机数

c - 关于 linux 模块 printk

c - 为什么以 null 结尾的字符串?或者: null-terminated vs.个字符+长度存储

python - 如何将 .swf 文件嵌入到我的 Google App Engine 应用程序中?

通过 NULL 指针访问 C++ 静态常量

c++ - 读取字符,如果不等于 ? 则打印

c - 如何在 Windows 上递归遍历 C 中的目录

c++ - 关于 delete() 类实例及其静态方法/变量的问题

java - 如何在 Spring 中保留静态类变量的值?

python - Django : execute command collectstatic raise UnicodeDecodeError