C 언어 에서 구조 체 와 메모리 정렬 인 스 턴 스 분석
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 언어 구조 체 와 메모리 정렬 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.