c++ - 静态字符数组和指针内存

标签 c++ arrays static

<分区>

一个 C++ 程序由两个 .cpp 文件组成,main.cpp 和 f.cpp。 main.cpp文件代码如下:

//main.cpp
#include <iostream>
using namespace std;

void f(char* s,int n);

const int N=10;
static char s[N];
static char a[N];

int main ()
{
    int i;  
    for (i=0; i<N; i++)
        a[i]='0'+i;

    for (i=0; i<N; i++)
        cout<<a[i]; 
    cout<<'\n';

    f(s,N);

    for (i=0; i<N; i++)
        cout<<a[i]; 

    cout<<'\n';
}

函数f 定义在文件f.cpp 中。该程序编译时没有错误和警告。执行时,程序定期结束,在 cout 上留下以下内容:

0123456789
!123456789

您对该程序的有效性和行为有何评论?详细解释。

我想 f 函数以某种方式非法访问 a 的内存,可能是因为 s 在内存中就在 a 之前,所以出现了一些带有索引的东西……不过我真的不确定,因为我猜 static 也会以某种方式改变事物..

最佳答案

取决于编译器。使用 gcc-4.3.4,如果您可以将 f 定义为:

void f(char* s,int n) { s[-n] = '!' ; } //danger!

生成您发布的输出。这是在线演示:http://ideone.com/8YT7k

但是被警告这样的编码真的非常很糟糕,你不应该这样编码,因为实际行为取决于编译器、它的版本、设置, 和选项。

静态数组是否彼此靠近放置取决于编译器,您的程序不应该这样假设。然而,在这种情况下,它们是相邻放置的,但这似乎取决于其他因素。例如,如果我在你的代码末尾打印 sa 的地址,而不从你的代码中删除任何内容,那么 s 有地址高于 a,但如果我删除了您的代码,则 a 的地址高于 s。看看你自己:

第一个打印:

0x804a0df   //address of s
0x804a0d5   //address of a
0xa         //difference of s and a i.e (s-a)

然后第二个打印这个:

0x804a0d5   //address of s
0x804a0df   //address of a
0xa         //difference of a and s i.e (a-s) [reversed!]

所以这取决于编译器将静态数组放在哪里的心情!

关于c++ - 静态字符数组和指针内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12331186/

相关文章:

c++ - double 值计算过程中错误计数增加

arrays - 如何在 MATLAB 中获取矩阵的第一列和最后一列?

php - 回显字母表选项而不将每个字母写为数组元素?

java - 将静态变量值传递给另一个类

c++ - C++ 接口(interface)中的静态反序列化工厂

c++ - OpenCV 3.0 正常贝叶斯分类器错误

c++ - 什么是在 C++ 中重载构造函数的正确而优雅的方法

c++ - 当守护线程在后台工作时返回一个函数 (c++)

ruby - 如何对具有不同哈希的数组中的值求和

c++ - 为什么 C++11 不支持在静态成员函数上声明 extern "C"?