C 언어 에서 구조 체 와 메모리 정렬 인 스 턴 스 분석

1.구조 체 유형
C 언어의 2 가지 유형:원생 유형 과 사용자 정의 유형,구조 체 유형 은 사용자 정의 유형 이다.
2.구조 체 를 사용 할 때 구조 체 유형 을 정의 한 다음 유형 으로 변 수 를 정의 한다.
->구조 체 정의 시 구조 체 유형 을 정의 한 다음 유형 으로 변 수 를 정의 해 야 합 니 다.
->구조 체 유형 을 정의 하 는 동시에 구조 체 변 수 를 정의 할 수 있 습 니 다.

//     
struct people
{
 char name[20];
 int age;
};
 
//            。
struct student
{
 char name[20];
 int age;
}s1;
 
//    struct student    s1,s1      ,    
typedef struct student
{
 char name[20];
 int age;
}s1;
3.배열 에서 구조 체 로 의 발전 점
->구조 체 는 수조 에서 발 전 된 것 으로 볼 수 있다.
->배열 에 두 가지 뚜렷 한 결함 이 있 습 니 다.첫 번 째 는 정 의 를 내 릴 때 크기 를 명확 하 게 해 야 하고 이 크기 는 나중에 변경 할 수 없습니다.두 번 째 는 배열 이 모든 요소 의 유형 이 일치 해 야 한 다 는 것 이다.
->구조 체 는 배열 의 두 번 째 결함 을 해결 하 는 데 사용 되 며 구조 체 를 그 중의 요소 유형 이 다른 배열 로 이해 할 수 있다.
4.구조 체 변수 중의 요 소 는 어떻게 접근 합 니까?
->배열 에 있 는 요소 의 접근 방식:표면 에 두 가지 방식(배열 아래 표시 방식 과 포인터 방식)이 있 습 니 다.실질 적 으로 모두 지침 방식 으로 접근 하 는 것 이다.
->구조 체 변수 에 있 는 요소 접근 방식:한 가지 만,또는->방식 으로 접근 합 니 다.

struct score
{
 int a;
 int b;
 int c;
};
 
struct myStruct
{
 int a;   // 4 
 double b;  // 8
 char c;
};
 
int  main()
{
 struct myStruct s1;
 s1.a = 12;        // int *p = (int *)&s1; *p = 12;
 s1.b = 4.4;       // double *p = (double *)(&s1 + 4); *p = 4.4;
 s1.c = 'a';      // char *p = (char *)((int)&s1 + 12); *p = 'a';
 
 int a[3];  // 3      ,    
 score s;  // 3      ,      
 
 s.a = 12;  //                 int *p = s; *(p+0) = 12;
 s.b = 44;  // int *p = s; *(p+1) = 44;
 s.c = 64;  // int *p = s; *(p+2) = 44;
}
5.구조 체 정렬 접근
구조 체 정렬 접근 이란 무엇 입 니까?

//       
struct s
{
 char c;   //     c   4  ,   1  
 int b;   // 4
};
 
int main(void)
{
 struct s s1;
 s1.c = 't';
 s1.b = 12;
 
 char *p1 = (char *)(&s1);
 printf("*p1 = %c.
", *p1); // t int *p2 = (int *)((int)&s1 + 1); printf("*p2 = %d.
", *p2); // 201852036. int *p3 = (int *)((int)&s1 + 4); printf("*p3 = %d.
", *p3); // 12. printf("sizeof(struct s) = %d.
", sizeof(struct s)); 8 return 0; }
6.구조 체 는 왜 정렬 하여 방문 해 야 합 니까?
->구조 체 에서 요소 정렬 방문 의 주요 원인 은 하드웨어 에 맞 추기 위해 서 입 니 다.즉,하드웨어 자체 에 물리 적 인 제한 이 있 기 때문에 배열 과 방문 을 정렬 하면 효율 을 높 일 수 있 고 그렇지 않 으 면 효율 을 크게 낮 출 수 있 습 니 다.
->정렬 접근 과 정렬 되 지 않 은 접근 을 비교 합 니 다.정렬 접근 은 메모리 공간 을 희생 하고 속도 성능 을 바 꿉 니 다.정렬 접근 이 아 닌 접근 속도 성능 을 희생 하여 메모리 공간의 완전 이용 으로 바 꾸 었 습 니 다.
7.구조 체 정렬 실례

struct mystruct1
{     // 1         4    
    int a;   // 4   4
    char b;   // 1   2(1+1)
    short c;  // 2   2
};
 
int main()
{
 printf("sizeof(struct mystruct1) = %d.
", sizeof(struct mystruct1)); // 8 return 0; }

분석:먼저 전체 구조 체 이 고 전체 구조 체 변수 4 바이트 정렬 은 컴 파일 러 에 의 해 보장 되 므 로 우 리 는 신경 쓰 지 않 아 도 된다.첫 번 째 요소 a,a 의 시작 주 소 는 전체 구조 체 의 시작 주소 이기 때문에 자 연 스 럽 게 4 바이트 가 정렬 되 어 있 습 니 다.하지만 a 의 끝 주 소 는 다음 요소 가 결정 해 야 합 니 다.두 번 째 요소 b 는 이전 요소 a 자체 가 4 바이트 를 차지 하기 때문에 그 자체 가 정렬 된 것 입 니 다.그래서 b 에 게 남 겨 진 시작 주소 도 4 바이트 로 주 소 를 맞 추 므 로 b 는 직접 놓 을 수 있 습 니 다.b 의 시작 주소 가 정 해 지면 끝 주 소 를 정할 수 없습니다.(채 워 야 할 수도 있 기 때문에)끝 주 소 는 다음 요 소 를 보고 정 해 야 합 니 다.그 다음 에 세 번 째 요소 c 입 니 다.short 유형 은 2 바이트 정렬(short 유형 요 소 는 0,2,4,8 과 같은 주소 에 두 어야 합 니 다.1,3 과 같은 홀수 주소 에 두 면 안 됩 니 다)이 필요 합 니 다.따라서 c 는 b 에 바짝 붙 어서 저장 할 수 없습니다.해결 방안 은 b 다음 에 1 바이트 의 메 모 를 추가 한 다음 에 c 를 넣 는 것 입 니 다.c.놓 은 후에 아직 끝나 지 않 았 습 니 다.전체 구조 체 의 모든 요 소 를 정렬 하여 보관 한 후에 아직 끝나 지 않 았 습 니 다.전체 구조 체 의 크기 는 4 의 정수 배 이기 때 문 입 니 다.

typedef struct mystruct2
{					// 1      	4    
    char a;			// 1			4(1+3)
    int b;			// 4			4
    short c;		// 2			4(2+2)
}MyS2;
 
int main()
{
	printf("sizeof(struct mystruct2) = %d.
", sizeof(struct mystruct2)); //12 return 0; }

struct mystruct1
{            //1        4    
    int a;          // 4       4
    char b;          // 1       2(1+1)
    short c;         // 2       2
};
 
typedef struct myStruct5
{       // 1        4    
    int a;     // 4   4
    struct mystruct1 s1; // 7   8
    double b;    // 8   8
    int c;     // 4   4 
}MyS5;
 
int main()
{
 printf("sizeof(struct mystruct5) = %d.
", sizeof(MyS5)); //24 return 0; }
 

struct stu
{       // 1         4    
 char sex;    // 1   4(1+3)
 int length;    // 4   4
 char name[10];   // 10   12(10+2)
};
 
 
int main()
{
 printf("sizeof(struct stu) = %d.
", sizeof(struct stu)); //20 return 0; }
 
총결산
C 언어 에서 구조 체 와 메모리 정렬 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C 언어 구조 체 와 메모리 정렬 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기