指针增量没有得到预期的结果

时间:2017-08-29 12:56:28

标签: c arrays pointers

指针增量没有给出正确的值,它指向不确定的地址。

想知道为什么*p++= <value>没有指向我想要的值,而是指向其他

我的代码:

void run_exe() {
    int i;
    uint8_t buf[20] = {"0"};
    uint8_t *p = NULL;
    uint8_t tx_buf[4] = {1,1,1,1};

    p = buf;
    *p++ = 0x14;        
    *p++ = 0x20;        
    *p++ = 0x30;        
    *p++ = 0x40;        
    *p++ = 0x50;        
    *p++ = 0x60;        
    memcpy( p+6, tx_buf, sizeof(tx_buf));
   // ARRAY_SIZE: is the macro just my array length.

    for (i = 0; i < ARRAY_SIZE(buf); i++) {
        printf("%d ", *(p+i));
    }

}

我正在打印HEX的十进制值,但至少我期待正确的值,但我得到了不确定的值。

我期待这样的输出。

14 20 30 40 50 60 1 1 1 1 0 0 0 0 0 0 0 0 0

输出:

0 0 0 0 0 0 1 1 1 1 0 0 0 0 255 127 0 0 0

1 个答案:

答案 0 :(得分:4)

你需要一个辅助指针,

uint8_t *ptr;

p = buf;
ptr = p;

*p++ = 0x14;

依此类推,因为++会修改指针的值。

然后,

for (i = 0; i < ARRAY_SIZE(buf); i++) {
    printf("%d ", ptr[i]);
}

++后增量或预增量运算符,在评估表达式后使指针p指向p + 1,因此p当您尝试打印时,指向buf

编辑:当然你也可以这样做,

for (i = 0; i < ARRAY_SIZE(buf); i++) {
    printf("%d ", buf[i]);
}

但我认为最初的答案解释了重要的原因。

EXTRA :另外,我99.9%肯定这是错误的

uint8_t buf[20] = {"0"};

你的意思,

uint8_t buf[20] = {0};

你的编译器可能会向你显示这个有问题的初始化的警告,因为"0"有指针类型,即使它可以转换为整数类型,它大多肯定不适合一个uint8_t所以你有一个溢出问题。