C语言-结构体


title:结构体
date:2021-9-29


结构体的定义初始化

1、不使用typedef的结构体

以下例子中,不加typedef时,struct STUDENT 是结构体类型名

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct STUDENT {
	int num;
	char name[20];
	int age;
	int weight;
};

int main() {	
	struct STUDENT stu;
	stu.num = 101;
	//数组直接输入字符串需用 strcpy函数,不能直接赋值
	strcpy(stu.name, "hello");
	stu.age = 18;
	stu.weight = 100;
	/*
	student stu = { 101,"hello",18,100 };
	*/
	printf("学号: %d 姓名: %s 年龄: %d 体重:%d", stu.num, stu.name, stu.age, stu.weight);

	return 0;
}


2、使用typedef的结构体

定义一个新的类型

以下例子中,加了typedef,struct STUDENT是结构体类型名,student也是结构体类型名

student s中的s是结构体变量

#include<stdio.h>
#include<stdlib.h>
typedef struct STUDENT{
    int number;
    int age;
    int weight;
    int score;
    char s;
}student;

typedef int INT32;
int main(){
    INT32 a;
    student s;
    return 0;
}
3、结构体数组
#include<stdio.h>
#include<stdlib.h>
typedef struct STUDENT{
    int number;
    int score;
}student;
int main(){
    int array[10];
    char buffer[10];
    student s[10] = {{1,10},{2,30}};
    s[0].number;
    s[0].score;
    s[1];
    student* p = s;
    printf("%d",s[0].score);
    printf("%d",(*p).score);
    printf("%d",p->score);
    return 0;
}

结构体中字节对齐原则

  • 按照最长的成员对齐
  • 保证整数倍地址对齐

按照最长的成员对齐:结构体中默认以所占字节最长的成员划分。例如,一个结构体中 int 占4个字节最长,则按 4字节作为排列长度

保证整数倍地址对齐:一个类型对齐的地址应是该类型所占字节的倍数。例如 char 类型占一个字节,它能占的地址是1 的倍数,short 占2个字节,它能站得地址是2的倍数

C语言-结构体

结构体默认按最长字节对齐,也可认为规定对齐的最长长度

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// #pragma pack(2) 规定在这个范围里的结构体按长度 2 对齐
#pragma pack(2)
typedef struct STUDENT {
	int a;
	char c;
	char res[3];
} student;
#pragma pack(2)

int main() {	
	printf("%d", sizeof(student));
	return 0;
}

结构体定义的原则:保证结构体字节对齐
#include<stdio.h>
#include<stdlib.h>
#pragma pack(2) /*指定按2字节对齐*/
typedef struct A {
	int  a;
	char c;
	char res[1];
}a;
#pragma pack()  /*取消指定对齐,恢复缺省对齐*/
typedef struct B {
	int  a;
	char c;
	char res[1];
}b;
int main() {
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(b));
	return 0;
}
/*
6
8
*/
上一篇:error: C2632: “int”后面的“bool”非法


下一篇:【STL源码剖析】总结笔记(9):set/multiset与map/multimap