我创建了三个缓冲区和变量,并将每个变量复制到相应的缓冲区。
然后我从缓冲区中取出指针并打印出来。
#include <stdlib.h>
#include <string.h>
int main() {
// Buffers.
unsigned char a_buffer[sizeof(int)];
unsigned char b_buffer[sizeof(int)];
unsigned char c_buffer[sizeof(float)];
// Variables ressources.
int a = 65500;
int b = 32000;
float c = 3.14;
// Variables pointers.
int *aa = NULL;
int *bb = NULL;
float *cc = NULL;
/* Copy variables to buffer. */
memcpy(a_buffer, &a, sizeof(int));
memcpy(b_buffer, &b, sizeof(int));
memcpy(c_buffer, &c, sizeof(float));
/* Set pointers. */
aa = (int*) a_buffer;
bb = (int*) b_buffer;
cc = (float*) c_buffer;
// Print values.
printf("%i %i %f\n", *aa, *bb, *cc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 65500 32000 3.140000
现在我喜欢将这些变量存储到一个缓冲区中并写下这个。
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
int main() {
// Buffer.
unsigned char buffer[sizeof(int) + sizeof(int) + sizeof(float)];
// Buffer pointer (first object).
unsigned char *buf_ptr = buffer;
// Variables ressources.
int a = 65500;
int b = 32000;
float c = 3.14;
// Variables pointers.
int *aa = NULL;
int *bb = NULL;
float *cc = NULL;
/* Copy variables to buffer. */
uint16_t cur = 0;
memcpy(buf_ptr + cur, &a, sizeof(int));
cur += sizeof(int);
memcpy(buf_ptr + cur, &b, sizeof(int));
cur += sizeof(int);
memcpy(buf_ptr + cur, &c, sizeof(float));
cur += sizeof(float);
/* Set pointers. */
cur = 0;
aa = (int*) buf_ptr + cur;
cur += sizeof(int);
bb = (int*) buf_ptr + cur;
cur += sizeof(int);
cc = (float*) buf_ptr + cur;
cur += sizeof(float);
// Print values.
printf("%i %i %f\n", *aa, *bb, *cc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 65500 2054246226 0.000000
第一个变量是正确的,第二个总是变化的,第三个总是零。
正确的做法是什么?
简短的答案是,在执行该部分时,由于指针类型,您似乎添加了错误的偏移量aa = (int *)buf_ptr + cur。
改为使用aa = (int *)(buf_ptr + cur)(相应地用于其他指针分配)。
这是一个执行此操作的 ideone,看起来可以工作:https ://ideone.com/64awsM
原因是这样的:当您转换buf_ptr为时(int *),您是说将其视为指向整数的指针(这就是您想要的)。但是然后您向该指针添加一个偏移量cur,因此如果您将其视为buf_ptr一个数组,那么您将访问buf_ptr[cur]每个元素是int. 既然你有cur=sizeof(int)(可能是 4 或 8),你很快就会离开你的缓冲区范围。如果保留buf_ptr为 char 数组,则偏移量如您所料是单个字节,并且仅在最后执行强制转换。
这也解释了为什么你的第一个元素总是正确的(因为你基本上正在做buf_ptr[0],所以元素大小是多少并不重要,因为偏移量为零)。
| 归档时间: |
|
| 查看次数: |
1868 次 |
| 最近记录: |