免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2422 | 回复: 8
打印 上一主题 下一主题

又一个关于c的疑问,请各位大侠帮忙解答!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-22 19:42 |只看该作者 |倒序浏览
今天在写程序的时候,无意中发现的,因为自己从来没有这么用过,也不是很清楚原因,所以把代码提炼了一下,请各位大侠帮忙解答~~分析一下原因!代码如下:
第一个:
#include <stdio.h>
static int a = 1;
static int b = a;
int main(){
    printf("%d\n",b) ;
    return 0;
}
在gcc下无法通过,在g++下编译通过~!
第二个:
#include <stdio.h>
typedef struct A{
    int i;
    char *a;
}A;
static char b = 'B';
static A a={
    .i = 1,
    .a = &b,
};
int main(){
    printf("%c\n",*(a.a)) ;
    return 0;
}
在gcc下编译通过,但是如果改成如下后,gcc又再次报错:
#include <stdio.h>
typedef struct A{
    int i;
    char a;
}A;
static char b = 'B';
static A a={
    .i = 1,
    .a = b,
};
int main(){
    printf("%c\n",a.a) ;
    return 0;
}

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
2 [报告]
发表于 2011-11-22 21:15 |只看该作者
本帖最后由 wait_rabbit 于 2011-11-22 21:59 编辑

回复 1# 1514_louluo
  1. #include <stdio.h>
  2. static int a = 1;
  3. static int b = a;
  4. int main(){
  5.     printf("%d\n",b) ;
  6.     return 0;
  7. }
复制代码
这个应该是跟编译器的策略有关。编译的时候,a的地址还并没有分配。

另外,c的标准里,我记得static变量只能用常数或者字符串初始化。

论坛徽章:
0
3 [报告]
发表于 2011-11-22 21:35 |只看该作者
回复 2# wait_rabbit


    哥们儿,去掉static也不好使啊~~!

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
4 [报告]
发表于 2011-11-22 21:56 |只看该作者
本帖最后由 wait_rabbit 于 2011-11-22 21:57 编辑
回复  wait_rabbit


    哥们儿,去掉static也不好使啊~~!
1514_louluo 发表于 2011-11-22 21:35


不是static的问题,是编译器的问题。
  1. static int a = 1;
  2. static int b = a;
复制代码
编译器在编译的时候,不能取得a的地址,从而读取a的值。这个只能在程序运行时候才能做到。也因此位于静态存储区的数据的初始化只能用常量或者字符串。

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
5 [报告]
发表于 2011-11-22 22:02 |只看该作者
本帖最后由 wait_rabbit 于 2011-11-22 22:12 编辑

至于g++为啥能编译通过咱就不清楚了。

没准儿是在运行main之前,主动添加了某些命令对b进行了初始化……c++这玩意儿。。。从来就很难说{:3_186:}

论坛徽章:
0
6 [报告]
发表于 2011-11-22 22:05 |只看该作者
回复 4# wait_rabbit


    哎,但是在g++下竟然编译通过了~!可能g++能够应付这样的情况吧!经过预处理 词法分析 语法分析 语义分析 到汇编 目标文件 可执行文件,应该是在编译成目标文件的时候出问题了,确实是找不到地址~~!只能说明g++ 对c文件的处理跟gcc对c文件的处理还是很不一样的~谢谢 兄弟回帖~

论坛徽章:
0
7 [报告]
发表于 2011-11-22 22:57 |只看该作者
本帖最后由 x5miao 于 2011-11-22 22:59 编辑

g++把你的文件当成C++文件编译了,而C++允许静态对象使用非常量表达式来初始化(C只能用常量表达式)。

第2个问题是因为对变量取&运算后是常量表达式,类似于sizieof(b)是常量表达式一样。但b本身不是常量表达式

论坛徽章:
0
8 [报告]
发表于 2011-11-23 09:42 |只看该作者
c语言必须先声名再使用

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
9 [报告]
发表于 2011-11-23 10:08 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP