【问题标题】:Why redefining a structure with same name, contain values of the 1st structure, even if the 2nd structure is declared after the first is destroyed?为什么要重新定义具有相同名称的结构,包含第一个结构的值,即使在第一个结构被销毁后声明第二个结构?
【发布时间】: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

我的问题是:

  1. 为什么不能使用同名变量(即 int a)访问块内的“int a”,而使用“my_struct m1”可以访问?

我的理解是,如果在块外,那就是新鲜的声明和定义。外部变量需要新赋值,否则它们将包含默认/垃圾值

【问题讨论】:

  • 因为该结构具有相同的名称,可能会引用相同的内存位置。在您的情况下,这意味着相同的价值,但我敢打赌这远非保证。你得到的(2)本质上是垃圾值,但在这个简单的例子中,它恰好对应于相同的值。需要更有知识的人来确认,这只是一种预感。
  • @Manish 这个问题没有多大意义,因为程序可以输出存储在内存中的任何内容,这些内容将被新对象占用。
  • 它们是不同的变量。 “本地”的被破坏了,因此同一个地方可以被另一个人使用。
  • 因为它们在堆栈上的地址相同。虽然这是未定义的行为,第二个的值不能依赖,因为它没有被初始化。
  • 你使用未初始化的局部变量,它们的值将是indeterminate(你应该真正看到它们的值是garbage)。您可能会以这种方式遇到未定义的行为

标签: c struct scope


【解决方案1】:

您处于未定义行为的世界中。您已经在 inside 块中创建了一些变量。美好的。然后,当您退出该块时,这些变量就会消失。您现在在外部中创建不同的变量。你尝试使用那些未初始化的变量,这些变量明确地是未定义的行为。

这意味着发生的情况可能因系统而异,或者在具有不同编译选项的同一系统上,甚至在不同运行时发生。无论如何,你永远不应该依赖这种持续发生的事情。

现在在那个系统和那个特定的运行中实际发生了什么:你的实现可能使用堆栈来存储结构和寄存器来存储你从不使用地址的单个值。因此,当您创建一个新的单个变量时,它会接收寄存器中的内容,并且可以是任何内容。但是当你创建一个新结构时,它只是重用前一个结构刚刚释放的内存,你得到旧值。但正如我已经说过的,你不能依赖它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2014-04-17
    • 1970-01-01
    • 2013-06-23
    • 2013-12-23
    相关资源
    最近更新 更多