C缓冲区说明

C buffers clarification

我对 C 中的缓冲区有疑问。基本上,我想使用缓冲区和 malloc 创建数组。我知道这不实用,主要是为了练习。所以我的代码是这样的:

uint32_t* buf;
buf = malloc (100*sizeof(uint32_t));
uint32_t i;

我想知道的是以下块之间的区别是什么:

for (i = 0; i<100; i++){
  buf[i] = i;
}

for (i = 0; i<100; i++){
  *buf = i;
  buf++;
}

根据我的理解,缓冲区只是指向内存中某个区域的指针,缓冲区指向最低字节。这也是我的理解 buf[i] 只是 *(buf + i),至少在我看来(可能是错误的)与 buf+i 然后 *buf 是一样的我以为我在第二个街区做了什么。但是,实际上,当我为第一个块执行 printf(buf[i]) 并为第二个块执行 printf(*buf) 时,第一个块为我提供了正确的 (i = 0; i<100; i++){ buf[i] = i; 我的输出,而第二个块说一切都是零。谁能告诉我我的假设是错误的吗?

编辑:对于我的输出方法,我基本上只是在 for 循环中有 printf 语句,所以像这样:

for (i = 0; i<100; i++){
  buf[i] = i;
  printf("Value: %d\r\n", buf[i]);
}

与第二个块类似,但使用 *buf 而不是 buf[i]

因为移动指针:

buf++;

移动指针到下一个位置,原来的指针丢失
在这两种情况下,缓冲区都被正确填充,但在第二种情况下,您将指针移动到缓冲区末尾后面的一个位置


要保存原始指针,请执行以下操作:

uint32_t* temp = buf;
for (i = 0; i<100; i++){
  *temp = i;
  temp++;
}

感谢 @MiltoxBeyond 关于使用 temp 指针的想法

我猜你在打印前忘记重置数组指针了。如果你的第一个方法是这样的

for (i = 0; i<100; i++){
    printf ("%u\n", buf[i]);        // <--- note: the value is unsigned
}

你的第二种方法是这样的

for (i = 0; i<100; i++){
    printf ("%u\n", *buf);
    buf++;
}

然后在第一种情况下打印相同的数组,但在第二种情况下打印相同的数组,因为缺少缓冲区指针的重置。您可以通过以下两种方式之一完成此操作

buf -= 100;     // reset buffer pointer

但最好使用缓冲区指针的副本

bptr = buf;
for (i = 0; i<100; i++){
    *bptr = i;                  // assign
    bptr++;
}

bptr = buf;
for (i = 0; i<100; i++){
    printf ("%u\n", *bptr);     // display
    bptr++;
}

最后你可以用

释放内存
free(buf);