gpt4 book ai didi

c - 在全局范围内重新定义指针

转载 作者:太空狗 更新时间:2023-10-29 17:01:09 30 4
gpt4 key购买 nike

this question我对 C 的这个看似基本的方面感到非常困惑。考虑这两行代码:

int *ptr;
*ptr = 2;

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;
^

ptr 默认是什么类型,intint*(如 ptr 是一个指针,还是 int)?如果是这样,这是否意味着 ptr 指向地址 2,还是没有改变?我会假设它已更改,因为除非您给 ptr 一个有效地址,否则它会崩溃。

int i = 5;
int *ptr;
*ptr = &i;

int main(){
printf("%d", *ptr); // 5
}

我知道未定义行为的可能性并且您不应该忽略警告,但我正在尝试查看此处实际发生的情况。

有关上下文,请参阅此 answer 下的评论链.

最佳答案

这是怎么回事:因为您显示的两行都在文件范围内(而不是本地范围),所以这两行都被视为声明,而不是声明和赋值语句。这是因为在文件范围内不能有语句 - 只允许声明和定义。

旧的 C 规则允许 int 类型的声明完全省略类型。因此,第二行是

  • ptr的声明/定义
  • ...这是一个指针,因为它有一个星号
  • ...它也是一个指向int 的指针,因为缺少类型。

最后一条规则非常陈旧,在语言标准的 ANSI 版本中已被弃用。这就是你收到警告的原因。如果您将代码更改为

int *ptr;
int *ptr = &i;

您的代码将编译并运行 ( demo )。

现在还有一个问题:为什么编译器不提示重复声明?事实证明,编译器会将多个相同的声明视为一个相同的声明,只要它们彼此完全相同即可。

关于c - 在全局范围内重新定义指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21152289/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com