我有一个unsigned char并且我向它添加了整数但是我希望得到sizeof
下一个字节(即sizeof
unsigned short int
或unsigned int
等等。
以下代码演示了我想要的内容:
#include <stdio.h>
static void write_ushort(unsigned char *b, unsigned short int value) { b[1] = value >> 8; b[0] = value; }
static void write_ulong(unsigned char *b, unsigned long int value) { write_ushort(b + 2, value >> 16); write_ushort(b, value); }
static unsigned short int read_ushort(const unsigned char *b) { return b[1] << 8 | b[0]; }
static unsigned long int read_ulong(const unsigned char *b) { return read_ushort(b + 2) <<16 | read_ushort(b); }
int main() {
unsigned char b[2];
unsigned int v0; /* 4 */
unsigned short int v1; /* 2 */
v0 = 200; v1 = 1235;
write_ushort(&b[0], v0); write_ulong(&b[1], v1);
/* what i expect printf to output is:
* 4 2
* but it obviously outputs 1 1 */
printf("%d %d\n", read_ushort(&b[0]), read_ulong(&b[1]));
printf("%d %d\n", (int)sizeof(b[0]), (int)sizeof(b[1]));
return 0;
}
答案 0 :(得分:2)
C是静态类型的,您不能通过为其赋值来更改变量(或数组)的数据类型。事实上,你根本无法改变变量的数据类型:一个变量对应于(几乎完全)某个内存块,其大小在编译时定义。您可以转换变量,以便将它们视为特定操作的不同类型,但内存块的大小始终相同。
并且,由于变量只是一块内存,因此计算机(或编译器)无法知道您使用char[2]
数组来存储short
或{{{ 1}}。你必须自己跟踪这个。
答案 1 :(得分:2)
这是不可能的。 sizeof
运算符将返回类型的大小或变量的声明类型的大小。您无法按摩其他任何内容,并且在将代码分配给新变量之前,您的代码不会跟踪存储数字的变量类型。
无论v0
或v1
的类型如何,当它们存储在数组的元素中时,它们都会转换为unsigned char
。
如果您想要4 2
作为输出,则需要将sizeof(v0)
和sizeof(v1)
传递给printf
,或者以其他方式跟踪此事。< / p>
答案 2 :(得分:1)
这是一个主要问题:
write_ulong(&b[1], v1);
你取第二个字节(两个字节的数组)并将其传递给write_ulong
,它被作为一个四个字节的数组处理。这意味着您正在写入原始数组b
之外的几个字节并覆盖堆栈。这是未定义的行为,会使您的程序表现得非常奇怪。