gpt4 book ai didi

c - 便携性问题

转载 作者:行者123 更新时间:2023-12-04 09:45:39 24 4
gpt4 key购买 nike

我编写了一个程序来执行各种处理并将结果写入/读取文件。

这个“结果”在这样的结构中

struct res
{
char id;
char* values;
int count;
long samplenumber;
};

假设我用这些函数写/读

write( file, &result, sizeof(struct res) );
read(file, &result, filesize(file) );

我担心的是:如果结构在 32b 机器上编写并在 64 机器上读取(或其他方式),会出现什么问题?

我不是要求对我目前正在做的事情进行任何改进,而是关于可移植性方面的工作方式问题。

最佳答案

这里有4个问题:

~ 类型的大小可以不同。 (使用 stdint.h 中的类型,例如 uint32_t。)

~ 编译器通常会在你的结构中插入填充,比如

struct res
{
char id;
/* unused byte */
/* unused byte */
/* unused byte */
char* values;
int count;
long samplenumber;
};

~ 整数的字节顺序可以不同。例如,3555896322可以表示为
D3 F2 AC 0202 AC F2 D3

~ char* 将作为无用指针保存到文件中。您需要自己逐字节编写字符串。

解决方案:

~ 使用 stdint.h 中的类型。

~ 不要使用结构来保存。 (或者使用所谓的 #pragma pack,但请记住它不可移植。)

~ 逐字节写入整数,如

uint32_t var = 3555896322;
putc(var >> 0 & 0xff, file);
putc(var >> 8 & 0xff, file);
putc(var >> 16 & 0xff, file);
putc(var >> 24 & 0xff, file);

~ 逐字节写入字符串,例如:

const char *ptr = "Hello, young programmer!";
while (*ptr)
putc(*(ptr++), file);
putc('\0', file);

~ 浮点类型可以直接保存,它们通常到处都是相同的大小:

float a = 1.23;
fwrite(&a, sizeof (float), 1, file);

关于c - 便携性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28170251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com