记一次stc单片机c51编程的指针问题
在对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
浙公网安备 33010602011771号