在阅读帖子时,我遇到了以下代码并根据帖子输出此代码是错误的说法:
数组元素不能是自动变量的地址。它可以是静态或外部变量的地址。
#include<stdio.h>
int main()
{
int a=5,b=10,c=15;
int *arr[]={&a,&b,&c};
printf("%d",*arr[1]);
return 0;
}
但是当在MinGW和在线编译器上运行此代码时,它可以正常工作而没有任何错误。
所以想知道这完全有效吗?
答案 0 :(得分:5)
在C99中没关系,但ANSI不是。
答案 1 :(得分:3)
对我来说很好看。我没有看到它有什么问题。如果我不得不挑剔,那就是你的格式和缩进......但那就是它。
编辑: 我认为你所指的帖子意味着你不能返回本地或自动变量的地址。在这个例子中,一切都在相同的范围内,所以它非常好。
编辑2: 好的,回到之前的经验,我想我可以在代码中找到“一些”弱点。我在英特尔编译器上看过这个。
由于变量是本地变量,编译器可能会将其提升为寄存器。在那种情况下,它的地址是无效的。但是,现代编译器需要能够跟踪这种依赖关系并避免将该变量放入寄存器中。
在我遇到的一个案例中,我通过内联汇编访问变量的地址 - 这是英特尔编译器无法追踪的。编译器然后将变量提升为register,我的内联汇编继续读取堆栈上的旧值而不是寄存器值。
显然这是我不应该做的事情,但如果变量不是自动的话就没关系。
答案 2 :(得分:1)
我认为此错误消息是编译器的一个错误;这是一个不必要的限制。在数组中引用auto(was:local)变量确实很危险,但在这种情况下,数组的范围和引用的变量是相同的(tought,它可以“导出”到其他范围,比如调用一个函数与数组,它抓住它的一些元素)。有几种方法可以产生这样的错误,甚至是那些无法检测到编译时的错误。是的,指针是危险的,但生活是如此。