gpt4 book ai didi

c++ - 为什么在 C 中允许对 int * arr[] 进行以下赋值?

转载 作者:太空狗 更新时间:2023-10-29 23:48:49 26 4
gpt4 key购买 nike

我尝试在 C 和 C++ 中输入:

int* arr[3]={1,2,3}; 

当我取消引用数组时,C 不会报告错误并打印 1,而 C++ 会报告分配给 int * [] 的错误类型的错误,这是我所期望的。为什么 C 允许这样做?

最佳答案

C doesn't report an error and prints 1 when I dereference array, and C++ reports an error for the wrong type assigned to int * [], which is what I expected. Why is C allowing this?

C 不允许这样做。 您的 C 编译器 不加评论地接受它,尽管它不符合 C 语言。很有可能您可以通过打开适当的警告选项说服您的 C 编译器对初始化发出警告。

您的初始化程序提供类型为 int 的值来初始化类型为 int * 的数组元素。 C 确实允许将整数转换为指针和将指针转换为整数,但这些不属于标准所说的在对象初始化期间自动执行的转换。为了符合标准(C99 或更高版本),需要显式转换:

int *arr[3] = { (int *) 1, (int *) 2, (int *) 3 };

C 的历史远远早于它的标准化,但是,早期的 C 编译器接受这种隐式转换是很常见的。仍然有相当多的代码依赖于它们。因此,一些现代 C 编译器接受这种没有转换的转换作为扩展。其中一些甚至默认情况下默默地这样做,即使标准实际上需要发出诊断。

围绕从此类转换中获得的指针的含义以及取消引用指针的效果,还有许多其他问题。 C本身没有指定。

关于c++ - 为什么在 C 中允许对 int * arr[] 进行以下赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52416242/

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