将变量复制到一个缓冲区中并读取它

cla*_*mus 5 c buffer store

我创建了三个缓冲区和变量,并将每个变量复制到相应的缓冲区。

然后我从缓冲区中取出指针并打印出来。

#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

第一个变量是正确的,第二个总是变化的,第三个总是零。

正确的做法是什么?

neo*_*cpp 2

简短的答案是,在执行该部分时,由于指针类型,您似乎添加了错误的偏移量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],所以元素大小是多少并不重要,因为偏移量为零)。