C lang基本问题 - 为什么我得到两个结构的相同地址?

时间:2015-05-29 18:28:22

标签: c

while (1) 
{
    struct entry n =
    {
        ele[i], NULL, 1
    };
    printf("%d", &n); // todo the same address
}

这个程序保持打印相同的地址,不是结构条目n = xxx是c ++和java中的“new”操作吗?非常感谢。

2 个答案:

答案 0 :(得分:3)

不,它根本不是一样的。在这里,您将创建一个已经分配空间编译时的结构,并且始终具有相同的地址。没有必要创建一个新的。您只需在结构中设置值。

该值在堆栈中分配,因为您处于相同的堆栈帧中,所以它将保持不变。

如果要将代码更改为调用函数,则值将更改。例如

void test1()
{
    struct entry n =
    {
        ele[i], NULL, 1
    };
    printf("%d", &n);
}

void test2()
{
    test1();
}

void main()
{
    test1();
    test1();
    test2();
    test1();
    test2();
}

从前两个开始,您将(很可能)获得相同的地址,因为调用中的堆栈修改完全相同。但是当你调用test2()时调用test1()然后地址不同,因为堆栈帧不同。

但是即使在这种情况下,struct 的地址也不能存储在任何地方,因为它只是一个临时的局部变量,它会在从函数返回后消失,并且取消引用它会调用未定义的行为

答案 1 :(得分:1)

  

结构条目n = xxx不像" new"在c ++和java?

由于我不熟悉这种语言,因此无法说出任何关于java的内容。

它肯定不像C ++中的new

n是一个自动变量,其地址&n在每次迭代中都是相同的 while循环。