#include<stdio.h>
int* add(int *a, int *b){
int c = *a + *b ;
return &c;
}
int main(void) {
int a=3,b=2 ;
int *ptr = add(&a,&b); // doubt in this line as it returns 5
printf("%d",*ptr);
}
我对该评论中有疑问。
我正在使用Codeblocks IDE(GNU gcc编译器),我想知道如果*ptr
中的main
指向c
中add
的地址函数,然后它应该打印垃圾,因为函数`add完成它的执行后,它会从堆栈中弹出,并且应该在堆栈中为它释放内存。从技术上讲,它应该指向垃圾。那怎么打印正确的值。
答案 0 :(得分:2)
您有未定义的行为,因为您返回的是函数局部变量的地址。一个启用了警告的好编译器会告诉你这个。
当您有未定义的行为时,您不会抱怨结果。没有必要想知道它为什么会给你&#34;正确的&#34;结果,因为它没有 - 它给你一些数字可能会或可能不正确,这取决于你无法控制的任何数量的因素。
答案 1 :(得分:2)
我认为这是未定义的行为。在我的系统中,此示例因分段错误而崩溃。当某些内容被释放时,可能只是移动指向该内存位置的指针而不会将内存清零。