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。
但是,如果我在另一个函数中创建任何变量,则会收到一个地址。
主要功能和“正常”功能之间有区别吗? 谢谢
答案 0 :(得分:2)
未定义的行为。如果值为零,那么您很幸运。您有一个未初始化的变量,想知道为什么它具有随机值?您可能会在main或调试版本(倾向于将内存初始化为零)中获得零,或者可能没有。它取决于编译器/ os / cpu,永远不应认为这是理所当然的。可能是任何东西,因为它是未定义的。
答案 1 :(得分:1)
此处未定义的行为。
首先,我假设您已经包含<stdio.h>
。
tst1
未初始化。如果尝试打印该值,则可能会出现0x0
的情况。但是,其他任何事情都可能发生。与tst2
相同。
另一件事,当您在%p
中使用printf()
格式说明符时,为了严格遵守规定,您需要提供void *
。因此,严格来说,您应该使用例如:
printf("P outside function1: %p \n", (void *)tst1);