【问题标题】:Not getting the expected results at pointer increment在指针增量时没有得到预期的结果
【发布时间】:2017-08-29 12:56:28
【问题描述】:

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

想知道为什么*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));
    }

}

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

我期待这样的输出。

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

【问题讨论】:

  • p++ 6 次后,p 指向哪里?
  • @SouravGhosh,我不明白你的评论。你的意思是说,我需要为 *p 分配内存?
  • 事实上,您显示的代码中根本不需要p 。您可以将buf 与普通数组索引一起使用( 指针算术,如果这是您想要的)。
  • @DanglingPointer 请忽略,我看错了代码。
  • @DanglingPointer 在您增加p 之后不会。然后它指向buf[6],这是你的问题。当你这样做时*p++ = 0x14;*p = 0x14; p = p + 1; 一样。

标签: c arrays pointers


【解决方案1】:

你需要一个辅助指针,

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 NOT 指向 @ 987654328@ 当您尝试打印时。


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

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 所以你有一个溢出问题。

【讨论】:

  • 还是直接用buf
  • @Someprogrammerdude 当然。我现在可以看到,但是当我决定回答时,我不知道p 来自哪里。在写它的时候......好吧,我决定保持原样。
  • 是的,我的意思是用 0 初始化数组元素。这是错误的,不是字符串文字,不知道为什么编译器没有抱怨。
  • "0" 具有数组类型。它可能会编译,因为 uint8_t 通常是 unsigned char 的 typedef,它的数组可以从字符串字面量初始化
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 2022-01-24
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多