You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++函数内static变量赋值为何未生效?求技术解析

问题:static局部变量赋值为何只生效一次?

static_outer的表现符合预期:调用print_str()函数时,static_outer会被赋予参数的值并输出。
而static_inner的表现却不符合预期:首次调用函数时它被赋予参数值,但第二次调用时,输出值仍与首次相同。
为何该赋值操作无法改变它的值?直觉是该行赋值因static_inner已被声明而被忽略,但编译器并未报错。

代码及输出如下:

static const char* static_outer;

void print_str(const char* const str) {

    static const char* static_inner = str; 
    cout << static_inner << "\r\n";
    
    static_outer = str;
    cout << static_outer << "\r\n";
}

int main() {    
    const char str1[] = "Foo";
    const char str2[] = "Bar";

    cout << "First call" << "\r\n";
    print_str(str1);
    
    cout << "\r\n" << "Second call" << "\r\n";
    print_str(str2);
}

// Output:
// First call
// Foo
// Foo
//
// Second call
// Foo <--- 此处为何不是"Bar"?
// Bar

原因解释

这是C++中static局部变量的初始化规则导致的:

  • 函数内的static const char* static_inner = str;不是普通赋值,而是初始化语句。static局部变量的初始化只会在第一次进入函数时执行一次,后续调用函数时,这条初始化代码会被直接跳过,变量会保留之前的取值。
  • 全局的static_outer则是每次调用函数时执行static_outer = str;这个普通赋值操作,所以每次调用都会更新它的值。

修正方法

如果需要每次调用都更新static_inner的值,要把声明和赋值分开:

void print_str(const char* const str) {
    static const char* static_inner; // 仅声明,默认初始化为nullptr
    static_inner = str; // 每次调用都会执行赋值
    cout << static_inner << "\r\n";
    
    static_outer = str;
    cout << static_outer << "\r\n";
}

内容的提问来源于stack exchange,提问作者Lukáš Řádek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:25:15