gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:20:04 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com