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);
我对 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);