字符型数组在内存中的存储

#include <stdio.h>
int main (void)
{
	union b
	{
		short k;  //测试环境short占2字节
		char i[2];  //测试环境char占1字节
	}*s,a;
	s=&a;
	s->i[0]=0x41;
	s->i[1]=0x52;
	printf("%x\n",s->k);
	return 0;
}

今天做题做了一道很怪异的题目,下面是代码,大家可以先猜一下答案。


本人一开始认为运行结果应该为 4152 ,但是在VS2008运行得出的结果竟然是 5241,咦,奇怪,怎么会反过来了呢?

经过一番测试,搜索。发现这个问题涉及到数据在内存存储的问题,也就是字节序的问题(点我查看更多关于字节序的介绍),原来在大部分的机器里面存储字符型数组是在内存中是按照从低位到高位的存储的,就是“0x41”放在内存的低位,“0x52”放到内存的高位,从数组的角度讲就是i[0]存到最低端,然后从低到高一直存。也就是下表的顺序

0x520x41

数据在内存中的存储都是二进制的,而且是八位一个字节的。所以i[2]在内存中实际存储为

0101001001000001


由于在共用体里面只能是多选一的,所以变量k的值也是上表一模一样的。转换成16进制数就是 5241 。

这段程序一开始的运行结果容易给人一种假象,就是这段代码把2个数颠倒输出的,其实输出的数就是个“0101001001000001”转化而成的16进制数5241。

这题虽然有点古怪,起码自己编程是不会这样写的,但是通过仔细研究,却了解了数据在内存中是怎样存放的。重在过程。


以上全部是本人的肤浅了解,如有错误,欢迎指出。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将结构体存入字符数组,可以使用类转换将结构体指针转换为字符指针,然后将字符指针存入数组。在需要使用结构体时,可以将字符指针再次转换为结构体指针。 以下是一个示例代码,假设有一个名为Person的结构体类,包含姓名和年龄两个成员: ```C++ #include <stdio.h> #include <string.h> typedef struct { char name[20]; int age; } Person; int main() { char buffer[3 * sizeof(Person)]; // 声明一个包含3个Person结构体大小的字符数组 Person* people = (Person*)buffer; // 将字符数组转换为Person结构体指针 // 将每个结构体的成员赋值 strcpy(people[0].name, "Alice"); people[0].age = 25; strcpy(people[1].name, "Bob"); people[1].age = 30; strcpy(people[2].name, "Charlie"); people[2].age = 35; // 循环遍历数组 for (int i = 0; i < 3; i++) { printf("Person %d: %s, %d years old\n", i+1, people[i].name, people[i].age); } return 0; } ``` 输出结果如下: ``` Person 1: Alice, 25 years old Person 2: Bob, 30 years old Person 3: Charlie, 35 years old ``` 在上述示例代码,首先定义一个大小为3个Person结构体的字符数组buffer。然后将buffer转换为Person结构体指针people,即将buffer的首地址赋值给people。接着可以对每个结构体的成员进行赋值。在循环遍历数组时,可以通过people指针来访问结构体成员。 需要注意的是,在使用字符数组存储结构体时,需要注意内存对齐、字节序等问题,避免出现数据错误等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值