函数内部的内存地址

时间:2019-04-24 03:39:50

标签: c++ c

主要

tst_struct *tst1;
printf("P outside function1: %p \n", tst1); //Output: 0x0
tst_func(tst1);

功能

tst_struct *tst_func(tst_struct *tst1)
{
    printf("P from param: %p \n",tst1);  // Output 0x0
    tst_struct *tst2;
    printf("P inside function: %p \n", tst2); // Output 0x7ffeebcf8940
}

我不明白为什么会这样。

我在两个功能上都做过同样的事情。

如果我创建一个变量并在main上检查地址,而不分配任何值,则结果为0x0。

但是,如果我在另一个函数中创建任何变量,则会收到一个地址。

主要功能和“正常”功能之间有区别吗? 谢谢

2 个答案:

答案 0 :(得分:2)

未定义的行为。如果值为零,那么您很幸运。您有一个未初始化的变量,想知道为什么它具有随机值?您可能会在main或调试版本(倾向于将内存初始化为零)中获得零,或者可能没有。它取决于编译器/ os / cpu,永远不应认为这是理所当然的。可能是任何东西,因为它是未定义的。

答案 1 :(得分:1)

此处未定义的行为。

首先,我假设您已经包含<stdio.h>

tst1未初始化。如果尝试打印该值,则可能会出现0x0的情况。但是,其他任何事情都可能发生。与tst2相同。

另一件事,当您在%p中使用printf()格式说明符时,为了严格遵守规定,您需要提供void *。因此,严格来说,您应该使用例如:

printf("P outside function1: %p \n", (void *)tst1);

请参见https://stackoverflow.com/a/24867850/10616174