auto变量地址初始化static静态指针的一些事

前网易架构师-高司机
游戏服务器领域优质创作者
博客专家认证
2013-08-14 09:43:49
在C语言中如果我们用auto变量地址初始化static静态指针是不对的。
例如:
#include <stdio.h>
int main(){
int a=0;
static int*p=&a;
return 0;
}
==[223]==root@gaoke:~$gcc -o test gaoke.c
gaoke.c: In function ‘main’:
gaoke.c:4: error: initializer element is not constant
我认为是因为static变量的内存是在编译期间就已经确定的,但是这里p指向的是a的地址,在编译期间,a的内存还没有分配,导致出错
但是c++呢??我们来看一看
#include <iostream>
using namespace std;
int main(){
int a=10;
static int*p=&a;
cout<<*p<<endl;
return 0;
}
==[223]==root@gaoke:~$g++ -o test test.cpp
==[223]==root@gaoke:~$./test
10
这个又作何解释?如果是编译器的原因,而不是语言本身怎么解释?
...全文
360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2013-08-15
  • 打赏
  • 举报
回复
在你离开{}时,你的局部对象地址会自动没有了,局部地址已经不属于该对象了,而静态指针这个时候会是一个悬空指针,会导致未定义行为
  • 打赏
  • 举报
回复
mujiok2003解决了我的问题。ganpengjin1说的也有道理,static 指针在使用的时候要非常小心。
mujiok2003 2013-08-14
  • 打赏
  • 举报
回复
c支持static initialization, 不支持dynamic intializaiton. 这两个概念可以在C++标准中找到。
mujiok2003 2013-08-14
  • 打赏
  • 举报
回复
答案在这里
  • 打赏
  • 举报
回复
static int*p=&a; 编译时,只是确定p的地址 运行时,才对p的内容进行初始化 这个我完全同意。那么C语言的这个代码作何解释
worldy 2013-08-14
  • 打赏
  • 举报
回复
static int*p=&a; 编译时,只是确定p的地址 运行时,才对p的内容进行初始化

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧