C语言Return by reference示例中sum_retbyptr未调用malloc无报错原因求解
问题原因说明
这个程序没有触发报错属于**C语言未定义行为(Undefined Behavior, UB)**的典型表现,未定义行为没有固定的运行结果,程序崩溃、结果异常、恰好正常运行都属于合法的表现范畴,当前场景下恰好运行正常的具体原因如下:
sum_retbyptr中定义的int* ptr是未初始化的野指针,存储的是栈内存上遗留的随机地址值,当前测试环境下这个随机地址恰好属于进程拥有读写权限的合法内存范围,没有触发操作系统的段错误拦截。- 你使用的gcc 10.3.0默认编译参数未开启野指针检测、栈内存强制初始化等防护规则,不会主动终止这类非法指针操作。
- 本次运行过程中,对野指针指向地址的写入、读取操作恰好没有覆盖栈帧返回地址、其他有效变量值等关键运行数据,也没有触发内存越界检测,因此程序可以正常执行完毕。
- 如果编译时添加
-Wall -Wuninitialized参数,gcc会直接输出warning: ‘ptr’ is used uninitialized [-Wuninitialized]的警告,明确指出代码问题。
注意:该运行正常的状态完全是随机巧合,更换编译参数、系统环境甚至同一环境多次运行都可能出现崩溃、输出结果异常等问题,这类野指针操作属于严重的代码错误,绝对不能在正式代码中使用。需要返回堆内存指针时必须先调用
malloc申请对应大小的合法内存后再进行操作。
对应的问题代码
#include <stdio.h> int *sum_retbyptr(int*, int*); int main(){ int a = 20, b=30, res; res = *sum_retbyptr(&a, &b); printf("Data transfer by return by ref : %d\n", res); return 0; } int *sum_retbyptr(int* a, int* b){ int* ptr; // ptr = malloc (sizeof(int)); *ptr = *a + *b; return ptr; }
内容的提问来源于stack exchange,提问作者Bokyun Na
相关产品推荐
相关产品推荐

