为什么不将此函数参数视为此函数的局部变量?

时间:2019-07-15 02:01:42

标签: c function pointers

我有一个返回整数指针类型的函数:

int* f(int a, int b){

   int *result;

   result = &a;

   *result += b;

   return result;
}

当我在main上调用它时:

int main(){
    int a = 5;
    int b = 2;

    int *result = f(a,b);

    printf("The result is: %d \n", *result);

    return 0;
}

它给我正确的输出(在这种情况下为7)。我的印象是,通过将参数a的地址分配给result可以在运行此函数时遇到分段错误。

我的假设是C将函数参数视为函数定义的局部变量。但是,我看到不是这样,为什么这个特定程序可以正常工作?

我正在通过gcc编译器使用Code :: Blocks 16.01。

1 个答案:

答案 0 :(得分:4)

仅仅因为它可以在您的计算机上运行并不意味着它不是未定义的行为。这是通过fluke起作用的,但是无效。

它可能会产生正确的结果,因为在您以后进行某些操作时,堆栈不会被忽略或以其他方式破坏。

例如,如果您进行另一个函数调用:

#include <stdio.h>
#include <stdlib.h>

int noop(int x, int y) {
   return x + y;
}

int* f(int a, int b){

   int *result;

   result = &a;

   *result += b;

   return result;
}

int main(){
    int a = 5;
    int b = 2;

    // Do something with undefined behaviour
    int *result = f(a,b);

    // Do something else which uses the stack and/or the same memory
    int x = 10;
    int y = 11;
    int z = noop(x, y);

    printf("The result is: %d \n", *result);

    return 0;
}

现在,输出被x的定义所限制,该定义恰好占用相同的内存,因此输出为10。但是,由于这是不确定的行为,因此任何事情都可能发生,包括崩溃。