gpt4 book ai didi

C 中指针变量的冲突类型(错误)

转载 作者:太空狗 更新时间:2023-10-29 15:57:37 27 4
gpt4 key购买 nike

(1)

#include <stdio.h>
#include <stdlib.h>

int a = 10, b = 20 , c = 30, d, e, *pa, *pb, *pc;

d= 10;
e= 100;

pa = &a;
pb = &b;

int main()
{
printf("%i, %i, %i, %i", pa, pb, d, e);
return 0;
}

(2)

#include <stdio.h>
#include <stdlib.h>

int a = 10, b = 20 , c = 30, d, e, *pa, *pb, *pc;

d= 10;
e= 100;

int main()
{
pa = &a;
pb = &b;

printf("%i, %i, %i, %i", pa, pb, d, e);
return 0;
}

为什么在主函数(1)外初始化指针变量pa和pb会报错?当 pa 和 pb 在 main 函数内时,它工作得很好 (2)。为什么我可以在主函数(d,e)之外初始化普通变量,而不能初始化指针变量?

我在 CodeBlocks 中得到的错误信息是: pa 的文件类型冲突。之前的 pa 声明在这里:第 4 行。

最佳答案

可执行代码必须放在函数内部。这是因为 C 程序的执行流程从调用 main() 开始。

int a = 10; 之类的行称为声明,它们可以被认为是在程序开始之前“发生”的。通常,编译器会生成一个包含所有全局变量数据的 block ,并在启动程序时加载它。

当您在文件范围内编写 d = 10; 时,这将被视为 int d = 10; 。由于在文件范围内不允许使用语句,因此它不是赋值语句。编译器认为这是一个声明,您打算在其中编写 int 但希望通过省略它来节省输入。

这称为implicit int,C89 有它,尽管它在 C99 中被删除了。

所以当你写 pa = &a; 时,隐式 int 使它成为 int pa = &a; 并且你得到一个错误,因为你已经声明了 paint * 类型,然后再次为 int 类型,它们是不同的类型。

然而,将变量声明为 int 然后将其重新声明为 int(就像您对 de) 只要第一个没有初始化程序就可以了。这称为暂定定义

为避免这一切,请确保任何不是声明的代码都放在函数内部。您可以在文件范围内编写:

int a = 5;
int *pa = &a;

等等。


此外,printf("%i, %i, %i, %i", pa, pb, d, e); 导致 undefined behaviour . %i 说明符必须与 int 匹配。要解决此问题,您需要传递 (int)pa 而不是 pa 等,或者使用 %p 说明符。

关于C 中指针变量的冲突类型(错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576527/

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