c风格字符串末尾没有'\0'引起的错误

#include <iostream>
using namespace std;


class Student

{
public:
Student() : id(0) {}


public:
int id;
char name[3];
char cellphone[6];
};


int main()
{
Student record;
cout << sizeof(Student) << endl;//字节为16,为何不是13(自己去搜索结构体字节对齐)


record.id = 201501;
//record.name = "qqr";这样赋值是错的,因为name是常量指针,不能做做左值
strcpy(record.name, "qqr"); //record.name这个字符串被赋值之后没有结束符,会出现什么情况?往下看
strcpy(record.cellphone, "1234");


printf("id: %d\n",record.id);
printf("name: %s\n", record.name);
printf("cellPhone: %s\n", record.cellphone);


return 0;

}

运行结果:

16
id: 201501
name: qqr1234
cellPhone: 1234
请按任意键继续. . .

问题:name我赋值为了“qqr”,为什么打印出来变成了qqr1234,那就是因为缺少‘\0’造成的。

我们可以把record这个结构体先写入到文件中,再使用ultraEdit打开:

00000000h: 1D 13 03 00 71 71 72 31 32 33 34 00 30 32 A5 6B

1D 13 03 00   代表id:201501

71 71 72 代表qqr,但由于后面没有00,则会把31 32 33 34也会计入到name里面输出

31 32 33 34 00 30代表cellphone:1234,30是垃圾字符

32 A5 6B就是上面多出的三个字节,由编译器自动填充,实现字节对齐


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值