在C语言中返回静态常量变量的地址

4
在C语言中,像下面这样返回静态常量变量的地址是否安全?
uint8_t *return_static_const_addr(void)
{
    static const uint8_t values[2] = {0x01, 0x02};

    return values;
}

3
或许考虑返回一个带有const限定符的指针:const uint8_t *return_static_const_addr(void) - pmg
根据上下文而定。从不违反任何规定,因此在某些情况下可能是安全的,但在其他用途中可能不安全。 - Eugene Sh.
1
这是安全的,但可能是设计不良。 - Jabberwocky
但是您应该意识到,返回非静态局部变量的地址会导致问题。 - Jabberwocky
2个回答

5

它在运行时将具有恒定的地址,所以是安全的。


-1
这里的静态常量变量是局部变量,因此不会存储在堆栈上,因此通常不是线程安全的。这也取决于编译器。如果您正在为C++11编写此代码,则返回静态常量变量是安全的,因为这种局部静态动态初始化是线程安全的。

1
C++不是编译器,而是一种与此问题无关的不同语言。因此,在C中,它并不取决于编译器。 - Eugene Sh.
1
static 局部变量具有与全局变量相同的静态存储期,因此它们必须与全局变量一样是线程安全的。 - 0___________
@EugeneSh。C++确实是一种语言。我举了一个C++11的例子,它扩展了标准C++库,在这里使用静态常量变量是安全的。 - techenthu
该问题标记为C,而不是C ++。 - Greg A. Woods

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接