惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
A
About on SuperTechFans
Vercel News
Vercel News
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
V
Visual Studio Blog
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
美团技术团队

博客园 - ayao

记录一次PVE(Proxmox VE)虚拟机从thin lvm 迁移到 ceph存储的问题 在PVE中实现宿主机与虚拟机同网段通信的配置方案 TrueNAS(原FreeNAS)的SMB共享文件夹,配置为不同的登录账户显示不同的目录 简要记录一下:ds1302 读取秒寄存器,总是在第一次读出ff,第二次才能读出准确的值的问题 python学习笔记——字典推导式 使用单片机驱动74CH595(8位串行输入、并行输出、可级联芯片)遇到的问题和解决过程 解决pl2303在 windows 10 或windows 11 显示“PL2303HXA自2012已停产,请联系供货商”问题 安装libjpeg,让php支持jpeg图片的裁切、缩放等操作 如何从oracle官方网站下载旧版本的jdk jre 【转帖】通过PHP读取dbf数据(visual fox pro,VFP数据库),官方的dbase无法读取字段为类型memo的数据,国外网站的解决方案 How to read FoxPro Memo with PHP? 问题处理:php json_decode函数处理的字符串中含有反斜杠“\”时,处理出错,返回的结果为NULL - ayao - 博客园 keepalived绑定的ip一段时间(大约几分钟)后消失的问题 设置jquery-ui datepicker的z-index值 配置完成vsftp,无法上传文件和建立文件夹 解决方法 Nginx 负载平衡 支持域名转发的方法 设置网页的图标 C# 线程、timer例句 c# delegate应用一例,类似于javascript中直接写的回调函数 flexigrid js表格控件在IE7下内容显示为空白
记一次stc单片机c51编程的指针问题
ayao · 2025-07-20 · via 博客园 - ayao

在对stc8h1k08进行编程时,发现了一个指针值不准确的问题。具体流程是:

1.在主函数中调用 test1函数,创建一个数组 unsigned char arr[3] = {'A','B',0x00},并返回指针 arr;

2.主函数中用 unsigned char * ptr; ptr = test1(); 记录test1函数返回的指针。此步骤中,指针指向的地址、指针值正常,与test1中保持一致。

3.在主函数中调用 test2 函数,并将ptr作为参数传递,test2 函数中再次检查指针指向的地址、指针值就出现异常了:指针地址与前述步骤一致,但是指针值不对。

解决办法:经初步测试,将第一步中的arr数组,定义到idata或xdata区域,可以消除问题。

等有时间了再分析一下汇编代码,看看到底发生了什么问题。

有问题的代码主要部分如下:

unsigned char * test1(){
    unsigned char bytes[3];
    bytes[0] = 'A';
    bytes[1] = 'B';
    bytes[2] = 0x00;//结束标记
    println("test1:");
    UartSendHexStrExt(bytes, sizeof(bytes));
    UartNewLine();
    UartSendBytesOrHexStr(bytes, 3, 1);
    UartNewLine();

    return bytes;
}

void test2(unsigned char * str){
    println("test2:");
    UartSendHexStrExt(str, sizeof(str)); UartNewLine();
    UartSendBytesOrHexStr(str, 3, 1); UartNewLine();

}

void main(){
    unsigned char * p;

    p = test1();
    println("main:");
    UartSendHexStrExt(p, sizeof(p));UartNewLine();
    UartSendBytesOrHexStr(p, 3, 1);UartNewLine();

    test2(p);

}

烧录到stc单片机,串口输出的结果如下:

test1:
000012
414200
main:
000012
414200
test2:
000012
001200//(这里就出现了错误,指针地址没问题,但指针值出问题了)

将第一步中的arr数组,定义到idata或xdata区域,可以消除问题:

unsigned char * test1(){
    unsigned char xdata bytes[3]; //将数组定义到idata或xdata区域
    bytes[0] = 'A';
    bytes[1] = 'B';
    bytes[2] = 0x00;//结束标记
    println("test1:");
    UartSendHexStrExt(bytes, sizeof(bytes));
    UartNewLine();
    UartSendBytesOrHexStr(bytes, 3, 1);
    UartNewLine();

    return bytes;
}

输出的正确结果:

test1:
010000
414200
main:
010000
414200
test2:
010000
414200