【发布时间】:2021-07-22 18:23:21
【问题描述】:
#include <stdio.h>
typedef struct
{
int a;
int b;
}my_struct;
void check (my_struct *my_check)
{
printf ("%d\n", my_check->a);
}
int main()
{
//block with local variables
{
int a = 2;
printf("int inside block %d\n", a);
my_struct m1;
m1.a = 2;
printf ("my_struct m1 inside block\t");
check (&m1);
}
//outside the block; so the variables and their values inside the above block is outside the scope of the following code
int a;
printf("int outside block %d\n", a);
my_struct m2;
my_struct m1;
printf ("my_struct m1 outside block\t");
check (&m1);
printf ("my_struct m2 outside block\t");
check(&m2);
return 0;
}
上面这段代码会输出
int inside block 2
my_struct m1 inside block 2
int outside block 0
my_struct m1 outside block 2
my_struct m2 outside block 522062864
我的问题是:
- 为什么不能使用同名变量(即 int a)访问块内的“int a”,而使用“my_struct m1”可以访问?
我的理解是,如果在块外,那就是新鲜的声明和定义。外部变量需要新赋值,否则它们将包含默认/垃圾值
【问题讨论】:
-
因为该结构具有相同的名称,可能会引用相同的内存位置。在您的情况下,这意味着相同的价值,但我敢打赌这远非保证。你得到的(2)本质上是垃圾值,但在这个简单的例子中,它恰好对应于相同的值。需要更有知识的人来确认,这只是一种预感。
-
@Manish 这个问题没有多大意义,因为程序可以输出存储在内存中的任何内容,这些内容将被新对象占用。
-
它们是不同的变量。 “本地”的被破坏了,因此同一个地方可以被另一个人使用。
-
因为它们在堆栈上的地址相同。虽然这是未定义的行为,第二个的值不能依赖,因为它没有被初始化。
-
你使用未初始化的局部变量,它们的值将是indeterminate(你应该真正看到它们的值是garbage)。您可能会以这种方式遇到未定义的行为。