记一次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

 

posted on 2025-07-20 10:52  ayao  阅读(19)  评论(0)    收藏  举报

导航