C 交换输出行导致程序错误(指针)

C 交换输出行导致程序错误(指针),c,pointers,C,Pointers,代码如下: #include <stdio.h> int *addition(int a, int b); int result; int *result_ptr; int *addition(int a, int b) { int c = a + b; int *d = &c; return d; } int main(void) { result = *(addition(1,2)); result_ptr = add

代码如下:

#include <stdio.h>

int *addition(int a, int b);

int result;
int *result_ptr;

int *addition(int a, int b)
{
    int c = a + b;
    int *d = &c;

    return d;
}

int main(void)
{
    result = *(addition(1,2));  
    result_ptr = addition(1,2);

    printf("result = %d\n", result); //outputline1
    printf("result_ptr = %d\n", *result_ptr); //outputline2

    return 0;
}
#包括
整数*加法(整数a、整数b);
int结果;
int*结果_ptr;
整数*加法(整数a,整数b)
{
INTC=a+b;
int*d=&c;
返回d;
}
内部主(空)
{
结果=*(加法(1,2));
结果_ptr=加法(1,2);
printf(“结果=%d\n”,结果);//outputline1
printf(“result_ptr=%d\n”,*result_ptr);//outputline2
返回0;
}

如果在编写当前代码时对其进行编译和处理,则result_ptr会给出奇怪的值。但是,如果交换两个输出行,则不会。它为什么会这样做?

您正在返回局部变量
c
的地址。这是。也就是说,您的程序是错误的,这意味着它没有义务显示可预测或正常的行为。更改两个
printf
的位置会给您带来另一个错误的程序,该程序(再次)不需要与先前的错误程序正确或一致地运行

编辑(添加C99标准草案N1256-重点矿山的相关引用)

6.5.3.2地址和间接运算符 [……]

语义

一元*运算符表示间接。如果操作数指向函数,则结果为 函数指示符;如果它指向一个对象,结果是一个左值,表示 对象如果操作数的类型为“指向类型的指针”,则结果的类型为“类型”。如果 为指针指定的值无效,一元*运算符的行为无效 未定义。87)

(脚注87)

因此,
&*E
相当于
E
(即使
E
是空指针),而
&(E1[E2])
相当于
((E1)+(E2))
。如果E是一元
&
运算符的有效操作数的函数指示符或左值,
*&E
是一个函数指示符或等于
E
的左值,这一点总是正确的。如果
*P
是左值,
T
是对象指针类型的名称,
*(T)P
是左值,其类型与
T
所指向的类型兼容

一元
*
运算符取消对指针引用的无效值包括空指针、与指向的对象类型对齐不当的地址、以及对象在其生命周期结束后的地址。

相关的句子是最后一句(强调我的):当
addition
函数返回其地址时,
c
局部变量已经结束其生存期,在
main

中取消引用
result
result\u ptr
都基于
addition()
中本地作用域变量的地址,该地址用于求值时不在作用域内。这是未定义的行为。