函数内的内存地址

Memory address inside a function

本文关键字:地址 内存 函数      更新时间:2023-10-16

MAIN

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。

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

主要功能和"正常"功能之间有一些区别吗?谢谢

未定义的行为。如果值为零,则您很幸运。您有一个未初始化的变量,并且想知道为什么它具有随机值?您可能会在 main 或调试版本中(倾向于将内存初始化为零(中得到零,也可能不会。它取决于编译器/操作系统/CPU,永远不应该被认为是理所当然的。它可以是任何东西,因为它是未定义的。

此处未定义的行为。

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

tst1未初始化。如果您尝试打印该值,其中一种可能性是您会得到0x0 .但是,其他任何事情都可能发生。tst2也是一样.

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

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

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