下面的C代码是否有效?
在阅读一篇博文时,我遇到了以下代码,根据博文,这段代码的输出是一个错误: 数组元素不能是自动变量的地址。它可以是静态变量或外部变量的地址下面的C代码是否有效?,c,C,在阅读一篇博文时,我遇到了以下代码,根据博文,这段代码的输出是一个错误: 数组元素不能是自动变量的地址。它可以是静态变量或外部变量的地址 #包括 int main() { INTA=5,b=10,c=15; int*arr[]={&a,&b,&c}; printf(“%d”,*arr[1]); 返回0; } 但当在MinGW和在线编译器上运行此代码时,它可以正常工作,没有任何错误 所以我想知道这是否完全有效???我觉得很好。我看不出有什么问题。如果我不得不挑剔的话,那就是你的格式和缩进。。。但
#包括
int main()
{
INTA=5,b=10,c=15;
int*arr[]={&a,&b,&c};
printf(“%d”,*arr[1]);
返回0;
}
但当在MinGW和在线编译器上运行此代码时,它可以正常工作,没有任何错误
所以我想知道这是否完全有效???我觉得很好。我看不出有什么问题。如果我不得不挑剔的话,那就是你的格式和缩进。。。但仅此而已 编辑: 我认为你提到的帖子的意思是你不能返回一个局部变量或自动变量的地址。在本例中,所有内容都在同一范围内,因此非常好 编辑2: 好的,回到以前的经验,我想我可以在代码中找到“一些”弱点。我在英特尔编译器上看到过这一点 由于变量是本地变量,编译器可能会将其升级为寄存器。在这种情况下,它的地址是无效的。然而,现代编译器需要能够跟踪这种依赖关系,并避免将该变量放入寄存器 在我不久前遇到的一个例子中,我通过内联汇编访问变量的地址,这是英特尔编译器无法跟踪的。然后编译器将变量升级为寄存器,我的内联程序集继续读取堆栈上的旧值,而不是寄存器值
显然,这是我不应该做的事情,但如果变量不是自动的,那就没问题了。我觉得这很好。我看不出有什么问题。如果我不得不挑剔的话,那就是你的格式和缩进。。。但仅此而已 编辑: 我认为你提到的帖子的意思是你不能返回一个局部变量或自动变量的地址。在本例中,所有内容都在同一范围内,因此非常好 编辑2: 好的,回到以前的经验,我想我可以在代码中找到“一些”弱点。我在英特尔编译器上看到过这一点 由于变量是本地变量,编译器可能会将其升级为寄存器。在这种情况下,它的地址是无效的。然而,现代编译器需要能够跟踪这种依赖关系,并避免将该变量放入寄存器 在我不久前遇到的一个例子中,我通过内联汇编访问变量的地址,这是英特尔编译器无法跟踪的。然后编译器将变量升级为寄存器,我的内联程序集继续读取堆栈上的旧值,而不是寄存器值
显然,这是我不应该做的事情,但是如果变量不是自动的,那也没关系。我认为这个错误消息是编译器的一种缺陷;这是不必要的限制。在数组中引用auto(was:local)变量确实很危险,但在这种情况下,数组的作用域和引用的变量是相同的(尽管如此,它可以“导出”到其他作用域,例如,使用数组调用函数,从而获取其中的一些元素)。有几种方法可以产生这样的错误,甚至是编译时无法检测到的错误。是的,指针是危险的,但生活就是如此。我认为这个错误消息是编译器的一种缺陷;这是不必要的限制。在数组中引用auto(was:local)变量确实很危险,但在这种情况下,数组的作用域和引用的变量是相同的(尽管如此,它可以“导出”到其他作用域,例如,使用数组调用函数,从而获取其中的一些元素)。有几种方法可以产生这样的错误,甚至是编译时无法检测到的错误。是的,指针是危险的,但生命是危险的。在C99中可以,但ANSI不是。在C99中可以,但ANSI不是。请将我们链接到您提到的帖子。也许你误解了它,但除非我们看到它,否则我们无法说出它说了什么。第六题。你测验的第四题和第五题也是胡说八道,第八题是未定义的行为。问题9完全是胡说八道,问题10不是标准的C,问题11和12除了MSDO之外没有任何意义,问题13表明它的作者是一个不懂
,15是UB等等的白痴。所以如果我是你,我就不会相信这个链接。这也正是我想的。那个测验有一半是完全的B,它让我的眼睛流血。但说实话,这里没有人谈论真正的问题,我是说这里问了什么!!将我们链接到您所指的帖子。也许你误解了它,但除非我们看到它,否则我们无法说出它说了什么。第六题。你测验的第四题和第五题也是胡说八道,第八题是未定义的行为。问题9完全是胡说八道,问题10不是标准的C,问题11和12除了MSDO之外没有任何意义,问题13表明它的作者是一个不懂
,15是UB等等的白痴。所以如果我是你,我就不会相信这个链接。这也正是我想的。那个测验有一半是完全的B,它让我的眼睛流血。但说实话,这里没有人谈论真正的问题,我是说这里问了什么!!请强调一下在数组中引用自动变量是多么危险??自动变量和局部变量将超出范围。如果指向它们的指针仍处于活动状态并在以后访问,则结果是未定义的。这并不比在C中执行的其他常见操作更危险。非静态变量的范围在定义的块之外过期。此外,您可以在更大的范围内(例如,全局/静态)定义指针,这些指针将包含原始变量范围之外的无效引用。真正的问题是你在神圣的时刻不会犯错误。当您使用re访问死变量时
#include<stdio.h>
int main()
{
int a=5,b=10,c=15;
int *arr[]={&a,&b,&c};
printf("%d",*arr[1]);
return 0;
}