指针数组初始化

starcat 2009-06-22 10:58:12
书上的例程,编译出错,说指针数组非法初始化。
上一行加上static就可以运行了,为什么??
我是菜鸟不懂啊,瞎弄的。

#include <stdio.h>
main(){
static int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));
}
...全文
122 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2009-06-23
噢,对了,补充一下,也许你会对什么是常量表达式有疑问,也许你会觉得在运行期a[0]是常量,下面再摘录标准关于常量表达式的解释:


6.4 Constant expressions

..........

A Constant expression can be evaluated during translation rather than runtime. and
accordingly may be used in any place that a constant may be.


一个常量表达式是在编译期而不是运行期计算的,a[0]在编译期都无法确定,因此它不是常量表达式。
回复
飞天御剑流 2009-06-23
[Quote=引用 8 楼 H2SO2H2SO2 的回复:]
初始化应该是在执行阶段的啊!并不是在编译阶段就初始化的,应该是正确的啊
[/Quote]

不是这样的,要看标准是怎么说的,下面摘录标准的原文:


6.1.2.5 Types

.............
Array and structure types are collectively called aggregate types.


6.57 Initialization

................

All the expression in an initializer for an object that has static storage duration or in an
initializer list for an object that has aggregate or union type shall be constant expressions


标准已经很明确地表达了数组的初始化列表必须是常量表达式!!

VC6.0这个行为是违反了标准的,VC6.0违反标准的行为多着呢。
回复
H2SO2H2SO2 2009-06-23
初始化应该是在执行阶段的啊!并不是在编译阶段就初始化的,应该是正确的啊
回复
飞天御剑流 2009-06-23
vc6的做法不对,vc6对标准的支持很差,有很多不符合标准的行为。


gcc下不能通过编译。
回复
hyyuanqiang 2009-06-23
哇塞
学习了
回复
zbihong 2009-06-22
学习学习!
回复
starcat 2009-06-22
[Quote=引用 4 楼 H2SO2H2SO2 的回复:]
在VC6.0没问题啊

在运行期内a[0]、a[1]和a[2]这几个地址才能确定??
[/Quote]

嘻嘻,看来是编译器的关系了。我用的是古董级的TC 2.01。
只是入门而已,不想安装VC那种大块头。
另外还弄了个UEstudio,以后学习深入一点了改用那个。
回复
H2SO2H2SO2 2009-06-22
在VC6.0没问题啊

在运行期内a[0]、a[1]和a[2]这几个地址才能确定??
回复
Arnold9009 2009-06-22
[Quote=引用 1 楼 supermegaboy 的回复:]
你的问题其实不是出在int a[3][3]上,是出在int * pa[3]的初始化上,只不过是由于int a[3][3]的声明形式引起的。

pa的初始化只能用常量,当a没有static的时候,它是自动数组,在运行期内a[0]、a[1]和a[2]这几个地址才能确定,在编译期不是常量,因此是非法初始化。而前面加static后,a成了静态数组,它存在于静态存储区内,在编译期内编译器已经可以给a确定地址,因此在编译期内a[0]、a[1]和a[2]都是常量,因此可以用于为pa初…
[/Quote]

回复
starcat 2009-06-22
thanks!
回复
飞天御剑流 2009-06-22
你的问题其实不是出在int a[3][3]上,是出在int * pa[3]的初始化上,只不过是由于int a[3][3]的声明形式引起的。

pa的初始化只能用常量,当a没有static的时候,它是自动数组,在运行期内a[0]、a[1]和a[2]这几个地址才能确定,在编译期不是常量,因此是非法初始化。而前面加static后,a成了静态数组,它存在于静态存储区内,在编译期内编译器已经可以给a确定地址,因此在编译期内a[0]、a[1]和a[2]都是常量,因此可以用于为pa初始化。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.2w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告