OSX,静态变量共享相同的地址

Posted

技术标签:

【中文标题】OSX,静态变量共享相同的地址【英文标题】:OSX, static variable sharing same address 【发布时间】:2010-06-22 19:59:45 【问题描述】:

在 OSX 中,我有以下代码。使用 gcc 4.0.1。我是 OSX 开发的新手,所以我不确定还有哪些其他系统信息在这里有用...

static int     textstrArgs[] =  1, 1, 1 ;

void func()

    static int first = 1;
    if (first)
    
        first = 0;
        // stuff
    
    /* other stuff */

其中 func() 被声明为“extern”并从另一个库调用。

问题是'texstrArgs[2]'和'first'的地址是一样的。也就是说,当应用程序加载时,它会将这两个变量放在内存中的同一位置。当调用 func() 时, first = 0 正在破坏静态 textstrArgs 数组中的值。

我这样做会导致这种情况发生吗?

感谢任何人提供的任何帮助。

【问题讨论】:

如果这是真的,那就是一个错误。你试过 gcc 4.2 吗? 你能分享一下你用来测试的简单代码sn-p吗? 【参考方案1】:

我怀疑他们实际上是在共享地址。我相信你更有可能访问数组越界或类似的东西。

尝试打印两个变量的地址。这会告诉你你的怀疑是否正确。

【讨论】:

【参考方案2】:

只是预感 - 尝试改变:

static int textstrArgs[] =  1, 1, 1 ;

static int textstrArgs[3] =  1, 1, 1 ;

另一件事-您实际上是否在任何地方引用 textstrArgs ?如果不是,那么它可能正在被优化掉。

【讨论】:

好吧,你指出了这个问题。实际上使用了错误的静态变量,但每个值通常都是“1”,所以事情通常有效。没有编译器错误,只是程序员错误。

以上是关于OSX,静态变量共享相同的地址的主要内容,如果未能解决你的问题,请参考以下文章

静态变量与实例变量:区别?

子类是不是共享 C++ 中父类的静态变量? [复制]

java基础(static---静态方法和静态变量以及静态方法)

java学习日记20230320-类变量和类方法

php中静态变量和静态方法

C++类静态成员变量作用域共享问题