函数返回指针的模糊行为?

时间:2016-11-26 02:07:45

标签: c function pointers

#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指向cadd的地址函数,然后它应该打印垃圾,因为函数`add完成它的执行后,它会从堆栈中弹出,并且应该在堆栈中为它释放内存。从技术上讲,它应该指向垃圾。那怎么打印正确的值。

2 个答案:

答案 0 :(得分:2)

您有未定义的行为,因为您返回的是函数局部变量的地址。一个启用了警告的好编译器会告诉你这个。

当您有未定义的行为时,您不会抱怨结果。没有必要想知道它为什么会给你&#34;正确的&#34;结果,因为它没有 - 它给你一些数字可能会或可能不正确,这取决于你无法控制的任何数量的因素。

答案 1 :(得分:2)

我认为这是未定义的行为。在我的系统中,此示例因分段错误而崩溃。当某些内容被释放时,可能只是移动指向该内存位置的指针而不会将内存清零。