我有一个问题这个函数这个函数使用指针而没有引用它但我感到惊讶它工作,我不知道为什么函数中的ptr没有引用和函数工作没有错误,如果有人可以解释我为什么它不会产生错误我会非常感激
#include<stdio.h>
int * Ret(int *x)
{
int *ptr;
*ptr = (-1*(*x));
return ptr;
}
int main(void)
{
int val = 5,op;
op = *Ret(&val);
printf("%d",op);
}
输出为-5,但我认为它必须产生运行时错误?
答案 0 :(得分:4)
这是未定义的行为。
任何事情都可能发生,因此可能是一种有效的行为。
如果您想捕捉这些问题,请使用外部工具,例如: valgrind
或自定义编译器,例如clang
使用地址清理程序。
答案 1 :(得分:1)
你是对的,因为这个功能做错了。 该函数返回一个指向整数的指针,该整数仅在函数内部分配。 指针指向的内存(值)在函数末尾不会改变,这就是获得正确值的原因。 (C的实现允许它)
如果您以后有更多功能,他们可能会覆盖此内存以及&#39; op&#39;可能已经改变了
底线,不要这样做!
答案 2 :(得分:0)
int * ptr在堆栈上。堆栈变量未初始化。所以它可以有任何价值。 * ptr =赋值取消引用ptr,即“任意值”作为地址,右侧存储在那里。如果“任何值”(作为地址)超出程序分配的内存,则运行时错误将出现。否则会覆盖程序的某些内存;此错误可能在以后任何时刻显现,根本无法显示,或者可能给出(已注明或未注明)错误的结果。 “糟糕的代码”,总结。
编译器可以通过将ptr的使用标记为使用未初始化的变量来捕获错误。