Coding In C day11

typedef关键字可以给数据类型起别名。


结构体。结构体可以如下定义一个结构体变量

/*
 * 结构体
 * */
#include <stdio.h>
/*struct {
		int age;
		char gender;
		float height;
	} student;//声明(定义)无名结构体的同时定义了结构体变量student
*/
/*struct student {
		int age;
		char gender;
		float height;
	} student;//声明(定义)结构体struct student的同时定义了结构体变量student
*/
/*struct student {
		int age;
		char gender;
		float height;
	};
typedef struct student stu;//将结构体类型名称重定义为stu.自重定义所在位置起就可以使用stu代替struct student了
*/
typedef struct {
		int age;
		char gender;
		float height;
	} stu;//将无名结构体的类型名称重定义为stu.自重定义所在位置起就可以使用stu这个无名结构体了



int main()
{
	/*
	struct student {
		int age;
		char gender;
		float height;
	};
	struct student student;//这里前一个student和struct和起来共同代表是一个结构体名称;后一个student是结构体变量名称;
	*/
	/*
	struct student {
		int age;
		char gender;
		float height;
	} student;//声明(定义)结构体struct student的同时定义了结构体变量student
	*/
	/*
	struct {
		int age;
		char gender;
		float height;
	} student;//声明(定义)无名结构体的同时定义了结构体变量student
	*/


	stu student = {24, 'E', 1.60f};
	printf("年龄是%d\n", student.age);
	printf("性别是%c\n", student.gender);
	printf("身高是%.2f\n", student.height);

	return 0;
}





变量的地址必须是变量大小的整数倍,这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。数据对齐会导致结构体中不同变量之间有空隙,结构体变量的大小并不是其中所有成员变量大小之和。程序员在声明(定义)结构体时应该尽可能地组织结构体的成员以图结构体变量占有空间尽可能小。


/*
 * 结构体变量占存储区大小
 *
 * 计算机数据存储的对齐和补齐
 * 计算器要求数据所占存储空间的起始地址应该是数据本身大小整数倍
 * 对齐:变量的地址必须是变量大小的整数倍。这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。
 * 补齐:结构体大小必须是其中最大成员变量的大小的整数倍。
 * double变量大小按照4字节计算。为了保证这一点,有时需要在结构体变量后面加入一些浪费的字节。这叫做补齐。
 * 
 * 数据对齐导致结构体中不同成员之间有空隙,结构体变量的大小并不是其中所有成员变量的大小之和。补齐导致结构体尾部加入了一些浪费字节。
 *
 *
 * 计算机对内存的管理是分组的,四个字节一组,每一组开头的字节的地址肯定是4的整数倍,第三个字节是2的整数倍。数据不能跨组存放。但是双精度浮点型double例外,double可以跨组存放。
 * 总结一下,可以得出数据所占空间的起始地址应该是数据本身大小的整数倍。
 * */
#include <stdio.h>
typedef struct {
	char ch;
	char ch1;
	int value;
} stru1;


int main()
{
	printf("结构体stru1大小是%d\n", sizeof(stru1));

	return 0;
}

/*
 * 结构体位域练习
 *
 * 声明结构体的时候可以使用位域限制某个成员变量所占的二进制位数,所有的定点数变量都可以使用位域
 *
 * */

#include <stdio.h>
typedef struct {
	int gender:1;
	int age:6;
}stru1;

int main()
{
	stru1 stru;
	//printf("&(stru.age)是%p\n", &(stru.age));//有编译错误 error: cannot take address of bit-field 'age'
	printf("大小是%d\n", sizeof(stru1));
	return 0;
}




  计算机内存管理存放数据可以是按照高位高字节存放,低位低字节存放,俗称"小端存储方式";也可以是低位高字节存放,高位低字节存放,俗称"大端存储方式"

通过检测一个联合体变量可以迅速测试得知当前计算机内存管理是按照"小端存储方式"还是"大端存储方式"。代码如下:


 
/*
 * 高位高字节,低位低字节存放,俗称"小端存储方式";
 * 低位高字节,高位低字节存放,俗称"大端存储方式"
 *
 * 以下程序可以迅速测试机器是那种存储方式
 * */

#include <stdio.h>

typedef union {
	char ch[4];
	int value;
} un;

int main()
{
	un u;
	u.value = 0x12345678;
	if (0x78 == u.ch[0]) {
		printf("小端\n");
	}
	else {
		printf("大端\n");
	}
	printf("ud 大小是%d\n", sizeof(u));
}

/*
 * 枚举练习
 * */
#include <stdio.h>

main()
{
	enum em {SPRING, SUMMER, AUTUMN, WINTER};
	/*
	 * const int SPRING = 0;
	 * const int SUMMER = 1;
	 * const int AUTUMN = 2;
	 * const int WINTER = 3;
	 *
	 * */
	typedef enum em season;
	printf("season大小是%d\n", sizeof(season));
	printf("SPRING是%d\n", SPRING);
	season s = SUMMER;
	/* int s = 1;*/
	printf("s是%d\n", s);

	
}

/*
 * 枚举练习
 *
 * */
#include <stdio.h>
#define N 2
enum sex {MAN, WOMAN};

main()
{
	enum sex sexs[N] = {MAN, MAN};
	printf("sexs[0]是%d\n", sexs[0]);//输出0
	printf("sexs[1]是%d\n", sexs[1]);//输出0
	sexs[0] = WOMAN;//把整型数1放入sexs[0]
	sexs[1] = 1u;//把整型数1放入sexs[1]
	printf("sexs[0]是%d\n", sexs[0]);//输出1
	printf("sexs[1]是%d\n", sexs[1]);//输出1
	sexs[1] = -1;//把整型数-1放入sexs[1];编译器不报警告
	printf("sexs[1]是%d\n", sexs[1]);//输出-1


}


C和C++的安全编码是指在编写C和C++代码时,采取一系列的措施来确保代码的安全性和防止常见的安全漏洞。由于C和C++是底层的编程语言,它们允许对内存直接进行操作,这也使得它们容易受到各种安全威胁的攻击。 在进行安全编码时,有几个关键的原则需要遵循。首先是验证输入。由于输入数据往往是来自外部,我们需要对输入进行验证,以确保它们符合预期的格式和范围。这样可以防止缓冲区溢出和格式化字符串漏洞等攻击。 其次,应该正确地管理内存。C和C++允许直接控制内存的分配和释放,但这也意味着需要手动管理内存的生命周期。如果没有正确地分配和释放内存,会导致内存泄漏和非法内存访问等问题。因此,务必要仔细检查并指定正确的内存操作。 此外,还应注意避免使用不安全的函数和功能。一些函数和功能可能存在安全风险,如strcpy和scanf等。应该使用更安全的替代函数,如strncpy和fgets等,以提高代码的安全性。 最后,代码的安全性也需要经过不断的测试和审查。通过进行静态代码分析和动态测试,可以发现和纠正代码中的潜在安全问题。此外,代码审查也是非常重要的,通过互相审查可以找到潜在的漏洞和错误。 总而言之,C和C++的安全编码需要遵循验证输入、正确管理内存、避免使用不安全函数和功能以及进行测试和审查等原则。只有通过采取适当的安全措施,才能确保代码的安全性并防止潜在的安全漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值