我需要在char数组中存储一些具有相同内存大小的整数值。
例如int32
应该适合char[4]
。
以下就是我试过的东西
int val = 123457;
char *data = val;
这适当存储,但如果我这样分配,我无法获得长度或释放它。
所以我试过这样。
char *data = malloc(sizeof(val);
但如何复制该int值。
由于某些要求,我必须存储在char array
中并从char array
获取int值。
答案 0 :(得分:2)
是的,你可以做到这一点,但除非你真正了解自己在做什么,否则将这些数据类型混合起来并不明智。
正如他们所说,这充满了危险。
但是,如果您希望这样做,然后复制数据,您可以这样做:
int val = 123457;
char *data = malloc(sizeof(val);
memcpy(data, &val, sizeof(val));
答案 1 :(得分:1)
memcpy
将解决您的问题。你做这样的事情:
int val = 123457;
char data[sizeof int];
memcpy(data, &val, sizeof int);
查看memcpy
的手册页以获取更多详细信息。基本上它将指定的字节数从第二个参数指向的内存复制到第一个参数的字节。
关于字节序的注意事项:如果您的计算机是小端,那么上面的data
将包含反向字节顺序的字节,如果您表示值{{ {1}}二进制或十六进制。如果您想在big-endian中查看123457
中的字节,那么您可能需要使用以下代码:
data
此处int val = htonl(123457);
char data[sizeof int];
memcpy(data, &val, sizeof int);
将您的计算机的任何字节顺序转换为网络顺序,即big-endian。
答案 2 :(得分:1)
与
int val = 123457;
char *data = val;
你可能意味着
int val = 123457;
char *data = (char*)&val; // note the & to give the address of val
现在数据指向int,data
没有保留值,只是指向它。
但是如果要将int值复制到分配的内存中:
char *data = malloc(sizeof(int));
int val = 123457;
memcpy( data, &val, sizeof(int));
现在,int值存储在data
和val
你也可以使用联盟
typedef union
{
int myint;
char mychars[sizeof(int)];
} u;
...
u myunion;
myunion.myint = 123456;
现在你在int中有值123456,你可以通过从myunion.mychars
答案 3 :(得分:1)
你可以做到这一点的另一种方法是使用union(如果你问我,还有一个无用的c ++)。
union utyp {
int i;
char ch[sizeof(int)];
};
union utyp x;
x.i=324255;
Union正在使其所有变量共享相同的内存空间
324255是100 11110010 10011111到二进制
所以例如(int)x.ch[2]
是4
答案 4 :(得分:0)
您可以使用类型转换轻松完成,例如
char data[8];
uint32_t a,b; // ATTENTION! int can be 64 bit depending on architecture and compiler !
a=12345;
b=678910;
*(uint32_t *)data=a;
*(uint32_t *)(data+4)=b;
// to retrieve the values
uint32_t c=*(uint32_t *)(data+4); // we'll get b
答案 5 :(得分:-1)
在大小为Char
的C 1 word or byte
中,意味着您只能存储一个字符或数字.. !!!当您尝试存储int32
号码时,其字符数为6 chars
。您在C中使用char
无法实现这一点。