警告:returning pointer to local variable

KEIL C51编译器警告管理:从原理到实践的安全处理指南 在嵌入式系统开发中,编译器警告是重要的代码质量反馈机制,它基于静态代码分析原理,能够识别出潜在的逻辑错误、未定义行为和可移植性问题。对于8051架构的MCU开发,KEIL C51编译器会针对特定的存储空间管理(如data、xdata、code)和硬件特性产生一系列警告,这些警告具有极高的工程价值,能帮助开发者规避运行时风险。通过合理配置警告级别、使用DISABLE指令或#pragma预处理指令进行精准控制,可以在保证代码安全性的前提下管理编译输出。本文聚焦于C182指针存储空间警告和C291函数返回值路径警 阅读详情

按理来说,在函数内部设置的局部变量应该是会在函数结束时被释放掉的,然而当把该指向该变量的指针返回的时候,指针所指的值并没有改变。那么这样究竟算不算对呢?函数结束后释放的究竟是什么呢?仅仅是设置的局部变量不存在了,然而内存中已经存下的值并没有改变,这样理解对吗?

然而既然编译器抛出一个警告,好言相劝,让我不要返回局部变量的值指针,我还是不要任性地不知好歹踩雷了。

关于为什么单步调试在函数结束之后,返回指针所指的变量值并没有变,我的理解是因为,在调试之后,该部分的内存虽然已经被系统收回,但是还有经历其他任何操作,所以值还是原来的值。也就是说我付不起房租被赶走之后,小屋就已经不属于我了,隔天我在窗口看看,里面可能还摆着我曾经的东西,但是隔月时候就不一定归谁住,摆着谁的东西了。所以说,最(qian)好(wan)不(bu)要(neng)从函数中返回局部变量的地址。(你如果用静态变量那另说...)那么问题来了,需要函数返回一个变量的时候怎样操作呢?

其实在上上周,陈老师跟我交代怎么写接口函数时,就说过了,函数的返回值是true/false,但是输出值并不是,在输入参数中应该传进去一个地址,用来存放处理之后的数据。我当时的想法是,我已经写好的所采用的办法是,直接返回指向输出数据变量的指针,并且自作聪明地在函数中使用malloc来防止内存被收回。这样子,如果我的函数返回的是对应数据类型的变量指针则表示操作完成,如果是NULL就是操作失败,这样不比专门返回true/false更方便吗?知道老师要求保证函数可重入的时候我才开始觉得自己的方法真是大大地欠妥啊!这才体会到之前老师强调的那种方法的深意,并不是为了假惺惺地让程序告诉我true了,还是false了,而是在函数外部已经申请好了内存空间,作用于不仅仅在函数之内。这相当于准备好了纸笔,让函数来写,写完了纸笔还是我的,别人并不能随便拿走,保证我能看到上面写了什么。

所以说,还是图样图森破的孩纸,还是得虚心学习啊!

C++多线程编程核心:从std::thread到atomic的实战避坑指南 多线程编程是现代软件开发中提升程序并发性能的核心技术,其原理在于通过创建多个执行流来充分利用多核CPU资源,实现任务的并行处理。在C++中,标准库提供了一套完整的线程管理工具,其中std::thread是线程创建与生命周期管理的基石,它封装了底层系统API,但需谨慎处理其join与detach状态以避免资源泄漏。为了保障共享数据在多线程环境下的正确性,互斥锁(mutex)与条件变量(condition_variable)构成了线程同步的基石,而std::atomic则为简单的原子操作提供了高效的无锁方案,这 阅读详情

相关推荐

C++多线程编程实战指南:从基础同步到高级并发工具

并发编程是现代软件开发的核心技术之一,它通过同时执行多个任务来提升程序性能。其基本原理是利用多核处理器架构,通过线程创建与管理实现任务并行。在C++中,多线程技术价值在于充分利用硬件资源,提高程序响应速度与吞吐量。实际应用场景包括服务器后端处理、高性能计算和实时系统等。本文聚焦C++多线程编程,系统梳理了线程同步、数据竞争等关键问题的解决方案,并详细解析了std::thread、std::mutex等核心组件的使用技巧与避坑要点,为开发者提供了一份实用的并发编程速查手册。

weixin_34184561的博客 324

C编译出现这样的警告:returning pointer to local variable

void PWM_GpioInit(void) { timer8_PWM_GpioInit(); timer4_PWM_GpioInit(); //timer3_PWM_GpioInit(); }void PWM_TimerInit(void) { timer8_PWM_Init(); timer4_PWM_Init(); //time

Stay Hungry, Stay Stupid 5298

C++11 std::thread 深度解析:从基础用法到线程池实战

并发编程是现代软件开发的核心技术之一,旨在通过同时执行多个任务来提升程序性能与响应能力。其基本原理在于利用操作系统提供的线程机制,将任务分解为可并行执行的单元。在C++中,自C++11标准引入的 `std::thread` 库为多线程编程提供了标准化的支持,其技术价值在于简化了线程的创建与管理,使开发者能够更高效地利用多核处理器资源。典型的应用场景包括高性能服务器开发、游戏引擎、并行数据处理以及科学计算等需要大量计算或高并发的领域。本文将聚焦于 `std::thread` 的核心机制,深入探讨其生命周期管理

weixin_30608503的博客 462

报错:warning: #1166-D: returning pointer to local variable

uint8_t *RTC_Get(void) { uint8_t time[6]={0}; ..... return time; } 当函数退出时,局部变量会被销毁,会造成程序异常。所以不能返回局部变量,需要定义成静态变量。

丨晋丨 2272

C++内存安全:深入解析林澈指针成因、检测与智能指针解决方案

在C++编程中,内存管理是核心挑战之一,指针作为直接操作内存的工具,其错误使用常导致程序崩溃或数据损坏。林澈指针(Dangling Pointer)特指指向已释放内存的指针,是典型的内存错误。其成因包括函数返回局部变量地址、释放后继续使用、多指针共享所有权及迭代器失效等。这类问题危害巨大,因为系统不会立即阻止访问,可能导致时隐时现的Bug。现代C++通过RAII(资源获取即初始化)原则和智能指针(如unique_ptr、shared_ptr)提供了自动化解决方案,能有效管理对象生命周期,避免手动释放的疏漏。

weixin_34204722的博客 418

达梦--利用存储过程与定时任务实现数据自动迁移

本文详细介绍了在达梦数据库中如何结合存储过程与定时任务实现数据自动迁移。通过一个电商订单归档的实战案例,阐述了从设计表结构、编写具备异常处理和幂等性的存储过程,到配置DBMS_SCHEDULER定时任务的全流程。该方法能有效替代手动脚本,确保数据同步任务的稳定、准确与自动化执行,适用于报表准备、数据备份等多种场景。

weixin_29261711的博客 429

extern和static,适合新手c returning pointer to local variable

原文地址https://www.cnblogs.com/yuxingli/p/7821102.html 1、关于extern,有些人喜欢把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如把上面test1.h改为     extern char g_str[] = "123456"; // 这个时候相当于没有extern     然后把test1.cpp中的g_str的定义去掉,这个时候再...

cbszju的博客 637

win10任务栏文件夹设置成竖形列表样式

win10任务栏文件夹设置成竖形列表样式

ftzchina的博客 7075

KEIL C51编译器警告精准屏蔽:从诊断到零警告工程的实战指南

在嵌入式C51开发中,编译器警告是保障代码质量的重要机制,其核心原理在于静态代码分析,通过语法和语义检查识别潜在风险。理解警告的分类与来源,有助于开发者区分代码缺陷、语言兼容性及优化建议等不同场景。从技术价值看,合理处理警告能提升代码可靠性,避免内存访问错误等严重问题。针对KEIL C51编译器,掌握全局DISABLE指令、文件级#pragma以及代码段级save/disable/restore等精准屏蔽方法,成为平衡安全检查与开发效率的关键。这些方法尤其适用于硬件寄存器访问、强制类型转换等嵌入式特定场景,

weixin_34248705的博客 381

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

互联网人提高效率必备软件合集

很多的时候我们解决不了问题,只是因为没有找到对的工具,实际上,很多好的工具就在那里,只是你不用而已。这点上,信息壁垒是一个很大的原因,因此我希望兄伙伴们多出去走走,不要只是局限在一个圈层;

zhonglunshun的专栏 3483

Infer 的 STACK_VARIABLE_ADDRESS_ESCAPE 检查:Pulse 如何捕获返回局部变量地址的悬垂指针

本文深入讲解 Facebook Infer(Java、C、C++、Objective-C 的静态分析器)内置分析器 Pulse 所报告的 `STACK_VARIABLE_ADDRESS_ESCAPE`(栈变量地址逃逸)问题。当程序中某个指向当前函数栈帧内部变量的地址被返回给调用方时,Pulse 会触发该警告——因为函数返回后栈帧销毁,这类地址会立即失效,构成典型的悬垂指针(dangling poi

gitblog_00637的博客 203

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

今天主要介绍接近分析工具CAT。

weixin_44184852的博客 1104

KEIL C51开发实战:精准管理编译警告,平衡代码质量与开发效率

在嵌入式C语言开发中,编译警告(Warning)是编译器对潜在代码风险或非规范写法的提示,它介于语法错误与正确代码之间,是代码静态分析的重要环节。其原理在于编译器在语法和语义分析阶段,会依据语言标准及特定架构(如8051的存储区划分)的约束规则,对代码进行合规性检查。正确处理警告的技术价值在于,它能在不中断构建流程的前提下,持续辅助开发者提升代码的健壮性、可维护性,并规避未来可能出现的运行时错误。在资源受限的单片机开发、尤其是使用KEIL C51这类具有历史包袱的工具链时,面对大量由平台特性或遗留代码产生的

weixin_33895475的博客 469

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2324

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 290

软件调试笔记26 - 编译器的调试支持 :编译错误和警告

编译过程中会产生错误或者警告,每个都会有一个唯一的标识符ID。 每个标识符是以1个或者多个大写字母开头,后面跟4位数字,字母表示报告错误信息的组件,数字用来表示错误或者警告的原因。 对于同一来源的错误,处于不同范围的ID对应不同的严重级别,分致命错误、错误和警告等。 编译警告:

imJaron的博客 379

libVLC 视频抓图

libVLC 中通过libvlc_video_take_snapshot核心接口来截图。以下是VLC播放器中使用的截图界面,我们仿照这个做一个界面。首先,你需要初始化 libVLC 实例和媒体播放器对象。1. 初始化 libVLC 和媒体播放器。菜单添加action,并响应槽函数。生成目录下snap.png。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1938

C++多线程编程实战:从std::thread到线程池与避坑指南

并发编程是现代软件开发的核心概念,它允许程序同时执行多个任务,从而充分利用多核处理器的计算能力,提升程序的响应速度与吞吐量。其基本原理是通过创建多个执行流(线程)来并行处理任务,关键技术包括线程管理、同步与通信。在C++工程实践中,自C++11标准起,语言内置了强大的多线程库,为开发者提供了统一、跨平台的并发工具。掌握多线程技术对于开发高性能服务器、实时系统、游戏引擎及数据处理应用至关重要。本文将深入探讨C++多线程的核心机制,涵盖线程创建与管理、互斥锁与条件变量等同步原语,并针对数据竞争、死锁等常见陷阱提

weixin_33735077的博客 369

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 快速参考备忘清单:Quick Reference 项目中的 C++ 语法与多线程实战速查指南

本篇技术指南以开源仓库 jaywcjlove/reference(为开发者分享快速参考备忘清单【速查表】)中的 [C++ 备忘清单](https://link.gitcode.com/i/341259df39d3da9773a11b7772fa7dd5) 为骨架,系统梳理从 C++ 基础语法、数组、控制流、循环、函数与 Lambda 表达式,到现代 C++ 智能指针、多线程与异步编程、预处理器的完

gitblog_00163的博客 332

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++并发编程实战:从线程管理到无锁数据结构与性能调优

并发编程是现代软件开发的核心技术,它允许多个计算任务同时执行,从而充分利用多核处理器的硬件潜力,提升程序性能。其基本原理在于通过线程、进程等机制实现任务并行,并借助同步原语(如互斥锁、条件变量)和内存模型来协调共享资源的访问,确保数据一致性与程序正确性。这项技术的核心价值在于解决高并发场景下的性能瓶颈,是构建高性能服务器、实时系统和大规模数据处理应用的基础。在实际工程中,开发者常面临数据竞争、死锁和伪共享等挑战,需要掌握从基础的std::thread管理、RAII模式,到高级的原子操作、内存序以及无锁数据结

weixin_30458043的博客 393

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言指针陷阱:函数返回局部变量地址为何危险?存储期与栈帧精讲

C语言编程中,指针与内存管理一直是开发者绕不开的核心课题,而“悬空指针”更是导致程序崩溃与数据错乱的常见元凶。理解函数返回局部变量地址为何不安全,首先要从程序运行时的栈帧机制讲起:局部变量具有自动存储期,函数调用结束后其栈空间即被回收,此时返回的地址指向的是已失效对象,属于未定义行为。尽管编译器会给出-Wreturn-local-addr等警告,许多工程实践仍会用-Wall -Wextra -Werror强制拦截风险。针对需要安全返回数据的场景,开发者可掌握调用方传缓冲区、返回static变量、malloc

weixin_34301132的博客 372

C语言变量初始化是必须的

摘要:本文系统探讨C语言变量初始化的关键问题,通过未初始化变量的实例分析编译器警告机制(如VC++的0xCCCCCCCC填充值),揭示内存中"垃圾值"的本质。文章对比不同存储类别变量(局部/全局/静态)的初始化行为,指出常见误区:误认全局变量自动清零、条件分支遗漏初始化和指针解引用风险。通过实战代码演示,强调"定义即初始化"的最佳实践,特别针对复杂控制流和指针操作提出防御性编程方案,最终论证显式初始化对代码健壮性的决定性作用。

ywl470812087的博客 2551
上一篇: Microlib究竟是森么呢?
下一篇: keil 调试指针不跳转 0x00000000 0000 MOVS r0,r0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值