8 c
在这个问题中,我对这个看似基本的C方面感到非常困惑.请考虑以下两行代码:
int *ptr;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)
gcc将发出以下警告:
main.cpp:4:1: warning: data definition has no type or storage class [enabled by default]
*ptr = 2;
^
main.cpp:4:2: warning: type defaults to 'int' in declaration of 'ptr' [enabled by default]
*ptr = 2;
^
main.cpp:4:8: warning: initialization makes pointer from integer without a cast [enabled by default]
*ptr = 2;
^
Run Code Online (Sandbox Code Playgroud)
什么类型ptr被默认,int或int*(如,ptr指针,或int)?如果是这样,这是否意味着ptr指向地址2,还是没有改变?我会认为它已被更改,因为除非您提供ptr有效地址,否则它会崩溃.
int i = 5;
int *ptr;
*ptr = &i;
int main(){
printf("%d", *ptr); // 5
}
Run Code Online (Sandbox Code Playgroud)
我知道未定义行为的可能性,你不应该忽略警告,但我试图看看这里发生了什么.
有关上下文,请参阅此答案下的注释链.
das*_*ght 12
以下是正在发生的事情:由于您显示的两行是在文件范围内(而不是局部范围),因此两行都被视为声明,而不是声明和赋值语句.这是因为文件范围内可能没有语句 - 只允许声明和定义.
旧C规则允许类型的声明int完全省略类型.因此,第二行是
ptrint,因为缺少类型.最后一条规则非常陈旧,并且已在ANSI语言标准版本中弃用.这就是你得到警告的原因.如果您将代码更改为
int *ptr;
int *ptr = &i;
Run Code Online (Sandbox Code Playgroud)
你的代码将编译并运行(演示).
现在还有一个问题:编译器怎么不抱怨重复的声明?事实证明,编译器会将多个相同的声明视为同一个声明,只要它们彼此完全相同即可.