我正在处理一些代码,这些代码广泛使用返回指向静态局部变量的指针的习惯用法。例如:
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/