指针不允许自动变量在函数调用 [duplicate] 后被删除

Pointer don't lets auto variable to get deleted after the function call [duplicate]

提问人:A_normal_guy 提问时间:3/8/2023 最后编辑:A_normal_guy 更新时间:3/8/2023 访问量:52

问:

当我在函数指针中使用指针而不是引用运算符时,不允许在函数调用后删除自动变量。

我从这段代码中得到,因为它是一个自动变量,在函数调用后它被删除。Segmentation fault (core dumped)int i=7;

#include<stdio.h>

int *func() {
  int i = 7;
  return &i;
}

int main(void) {
  int *a;
  a = func();
  printf("%d", *(a));

  return 1;
}

但是当我使用额外的指针而不是引用运算符时,我不会收到任何错误并获得 7 作为输出。为什么这个指针不允许删除变量 i?

#include<stdio.h>

int *func() {
  int i = 7;
  int *ip = &i;
  return ip;
}

int main(void) {
  int *a;
  a = func();
  printf("%d", *(a));

  return 1;
}
C 指针 作用域 取消引用 自动存储

评论

0赞 Gerhardh 3/8/2023
“不允许在函数调用后删除自动变量。”变量将被删除。不允许查看该内存位置。
0赞 Support Ukraine 3/8/2023
"...函数调用后自动变量被删除。好吧,在大多数系统上,当函数返回时,具有自动存储持续时间的变量不会真正删除。您的变量(在大多数系统上)仍存在于堆栈内存中,值为 7。因此,只要堆栈的该部分未被其他代码(通常是函数调用)使用,如果您具有指向该内存的正确指针值,则将读取值 7。在第一个代码示例中,很可能是编译器决定返回 NULL 而不是真正的 .允许这样做......i&i
0赞 Support Ukraine 3/8/2023
....因为它可以看到它是指向局部变量的指针。在第二个示例中,编译器似乎“看不到”也指向局部变量,因此返回实际值,您可以使用该指针访问该值。这就是我的编译器所做的。而不是尝试 在这两种情况下,您的程序都有未定义的行为。ipigccprintf("%d",*(a));printf("%p", (void*)a);
0赞 A_normal_guy 3/8/2023
因此,这是不应该做的事情。它具有未定义的行为,其结果可以在系统之间更改。
0赞 tstanisl 3/8/2023
@Gerhardh,情况更糟。此指针的所有副本都变为不确定。任何使用其值都会导致 UB。

答:

2赞 Vlad from Moscow 3/8/2023 #1

这两个程序都具有未定义的行为,因为在调用函数后,会尝试取消引用不指向现有对象的无效指针。func

评论

0赞 A_normal_guy 3/8/2023
第二个始终打印 7 并返回 1。
3赞 Vlad from Moscow 3/8/2023
@A_normal_guy 未定义的行为意味着任何事情都可能发生,即使是预期的结果。但无论如何,这样的程序是不正确的。
1赞 Gerhardh 3/8/2023
@A_normal_guy 1) 尝试在之前放置另一个函数调用,看看它是否更改。2) 禁止访问该地址。你甚至不知道这个价值。printf
0赞 Jabberwocky 3/8/2023
@A_normal_guy谷歌“C undefined behavior”