我不明白指针的行为
I don't understand the behavior of a pointer
我在编队中,我们看到了指示。我们正面临一个谜 :
#include <stdio.h>
#include <stdlib.h>
int main()
{
short *p_var = 0;
if (p_var == NULL) {
short var = 123;
p_var = &var;
printf("ma variable= %d \n", *p_var);
}
printf("ma variable= %d \n", *p_var);
return 0;
}
如您所见,此函数的目的是显示有关指针的一些问题,例如范围或空错误。在这里,好的结果是 123
和 0
,由 printf
显示,但其他伙伴有 123
和 123
。我们使用相同的 IDE 并使用相同的编译器。
你知道会发生什么吗?
第一个 printf 给出了正确的结果,因为您在 if 块中声明了一个变量 var 并使用了一个指针变量来打印它的值。
此变量的范围仅在 if 块内。 for 循环外部是一个无效指针,因为 c 中的指针用于存储变量的地址,而您尚未在 if 块外部存储 ant 地址。
此代码没有好的行为:第二个printf
的行为是未定义。
指针设置在 if
块内以指向在此范围内定义的变量,var
设置为 123
。第一个 printf
的行为已完全定义并确实打印 ma variable= 123
.
当控件离开此块时,变量 var
超出范围,它的位置可能会用于其他目的...或不会。
通过指针访问此内存具有未定义的行为。它可能会在某些机器上产生值 123
,在其他机器上产生另一个值,例如 0
,并在更奇特的体系结构上崩溃。行为可以从一个编译器更改为另一个编译器,使用不同的编译器选项,使用不同的操作系统,甚至只是不同的时间......没有什么可以预测的,行为是未定义的。
建议您的老师介绍无效指针等概念,但他们应该说此代码的任何行为都是 good 或 expected。请他们解释未定义的行为,这段代码和您的经验是一个很好的例证。
我在编队中,我们看到了指示。我们正面临一个谜 :
#include <stdio.h>
#include <stdlib.h>
int main()
{
short *p_var = 0;
if (p_var == NULL) {
short var = 123;
p_var = &var;
printf("ma variable= %d \n", *p_var);
}
printf("ma variable= %d \n", *p_var);
return 0;
}
如您所见,此函数的目的是显示有关指针的一些问题,例如范围或空错误。在这里,好的结果是 123
和 0
,由 printf
显示,但其他伙伴有 123
和 123
。我们使用相同的 IDE 并使用相同的编译器。
你知道会发生什么吗?
第一个 printf 给出了正确的结果,因为您在 if 块中声明了一个变量 var 并使用了一个指针变量来打印它的值。
此变量的范围仅在 if 块内。 for 循环外部是一个无效指针,因为 c 中的指针用于存储变量的地址,而您尚未在 if 块外部存储 ant 地址。
此代码没有好的行为:第二个printf
的行为是未定义。
指针设置在 if
块内以指向在此范围内定义的变量,var
设置为 123
。第一个 printf
的行为已完全定义并确实打印 ma variable= 123
.
当控件离开此块时,变量 var
超出范围,它的位置可能会用于其他目的...或不会。
通过指针访问此内存具有未定义的行为。它可能会在某些机器上产生值 123
,在其他机器上产生另一个值,例如 0
,并在更奇特的体系结构上崩溃。行为可以从一个编译器更改为另一个编译器,使用不同的编译器选项,使用不同的操作系统,甚至只是不同的时间......没有什么可以预测的,行为是未定义的。
建议您的老师介绍无效指针等概念,但他们应该说此代码的任何行为都是 good 或 expected。请他们解释未定义的行为,这段代码和您的经验是一个很好的例证。