C语言初始化时间

来源:百度知道 编辑:UC知道 时间:2024/06/03 12:43:21
main()
{
int i=0;
switch(i)
{
int i=1;
case 0:printf("i:%d\n",i);
break;
case 1:printf("1\n");
break;
case 2:printf("2\n");
break;
}

}
打印出来是乱码,从结果可以看出在switch里面定义的i已经将外面的i给覆盖掉了,但是好像并没有进行初始化(i的值不是1),也就是说在switch里面i被分配空间了,但没有初始化 ,因为switch语句从第一个匹配的case开始执行。请问变量是在什么时候进行初始化的,是在执行的时候吗,要是在编译或链接的时候,为什么switch里的i空间分配了,但没有初始化呢,也许是我理解错了,请高手作答。
二楼,你用的是gcc编译器吧,好像gcc或cc是报这个错,但是用VC编译时不出错,这是我在看C专家编程时遇到的一个问题,当时作者说这个问题我没明白于是就试了一下,(*^__^*) 嘻嘻……。那初始化是在什么时候呢?

C语言中有数据有两种初始化时间。

  1. 在main函数之外定义的数据。

    一般来说都是在main函数之前声明的数据,这些数据在程序创建初期就申请好了内存,放在堆当中,在内存当中的字节码都清0。

  2. 在main函数之内定义的数据。

    有两种,一种是使用栈空间,自动分配释放的内存。另外一种是使用动态分配函数,在堆空间中,手动分配释放的内存。这两种分配都不会初始化数据(除了calloc函数)。需要人为手动初始化数据,否则运行结果不正确。

你这个语法就有错。
这样操作是不允许的。。讨论这个基本没意义。。

jump to case label
crosses initialization of `int i'
[Warning] unreachable code at beginning of switch statement

c语言里一般在执行语句的前面初始化所有的变量,如果在执行语句后申请的话会出错误。但是在C++里是可以的