如何写入缓冲区(void指针)?

时间:2012-03-08 22:01:36

标签: c linux unix

我想用2个字符和一个向量(uint64_t)写入文件,但我首先必须将它们全部写入缓冲区。然后缓冲区将写入文件。我应该如何将这3个变量写入缓冲区(void指针),以便所有变量都包含在一个(void指针)变量中。

例如我想写

char a = 'a';
char b = 'b';
uint64_t c = 0x0000111100001111;

void *buffer = malloc(sizeof(char)*2+sizeof(uint64_t));

然后使用

将其写入文件
write(fd, buffer, sizeof(char)*2+sizeof(uint64_t));

2 个答案:

答案 0 :(得分:8)

这是(几乎*)完全安全的方式:

uint8_t *buffer = malloc(2 + sizeof(uint64_t));
buffer[0] = a;
buffer[1] = b;
memcpy(buffer + 2, &c, sizeof(c));

您可能会尝试执行*(uint64_t *)(buffer + 2) = c;之类的操作但由于对齐限制而无法移植。

请注意sizeof(char) == 1,根据C标准中的定义。

(*)我假设8位char,这几乎是,但不完全是通用的;在具有16位char的平台上,使用memcpy同时使用ab

答案 1 :(得分:0)

好吧,你可以将数据放到这样的缓冲区中:

void *buffer = malloc(size_of_buffer);
char *ch = buffer;
*pos++ = a;
*pos++ = b;
*(uint64_t*)(pos) = c

或者使用像cnicutar建议的memcpy。但是,我认为当时只将一个元素写入文件会更容易,更不容易出错:

write(fd, &a, sizeof a);
write(fd, &b, sizeof b);
write(fd, &c, sizeof c);

小心端点问题。