'구조체'에 해당되는 글 2건

  1. 2008.08.28 구조체가 메모리에 할당되는 크기
  2. 2008.03.07 자료구조 1주차 구조체
구조체의 메모리 할당은 멤버들을 주어진 순서대로 할당한다.

      1 /*
      2  * 작성일 : 2008. 08. 28.
      3  * 작성자 : 박상현[정보통신총괄]
      4  * 내 용 : 구조체 테스트
      5  */
      6
      7 #include <stdio.h>
      8
      9 int main()
     10 {
     11         struct A1
     12         {
     13                 char a;
     14                 int b;
     15                 char c;
     16         } X;
     17
     18         struct A2
     19         {
     20                 char a;
     21                 char b;
     22                 int c;
     23         } Y;
     24
     25         printf("X sizeof : %d, Y sizeof : %d\n", sizeof(X), sizeof(Y));
     26         return 0;
     27
     28 }
     29

[linux6@cam00 four]$ make
cc -O2 -Wall -Os -g -I/usr/include -c struct.c
cc -o struct  struct.o
[linux6@cam00 four]$ ./struct
X sizeof : 12, Y sizeof : 8

결과에서 보는 것처럼 A1, A2 두 구조체에는 똑같이 char 둘, int 하나씩 정의했으나,

각각의 크기는 12 와 8 로 차이가 났다.

X 구조체를 보면 메모리에 4바이트를 할당한 후 a 멤버를 저장한다. 다음 멤버 b 는 정수이므로

3바이트 남은 공간에 저장될 수 없으므로 3개의 바이트를 건너뛰어 적정한 경계로 이동한다.

그리고 4바이트 할당 후 저장된다. 마지막으로 c 멤버를 위해 4바이트 할당 후 저장한다. 따라서

12바이트를 사용하게 된다.

그러나 Y 구조체는 경계 정렬이 적게 일어나는 멤버들을 인접하여 배치함으로써 구조체 빈 공간을

최소화하였다.

A2 구조체와같이 효율적으로 멤버들을 배치함으로써 낭비되는 공간을 줄이도록 하자.
Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요


4학년 1학기 자료구조 재수강...ㄷㄷㄷ;

새로 배우는 기분으로 열심히^^

/***************************************************************************************************************
 *
 * 파일명 : test.cpp
 * 파일내용 : data.txt 의 파일 내용을 읽어와 구조체에 저장한 뒤 출력한다.
 * 작성자 : 박상현
 * 작성일 : 2008. 3. 6.
 * 과목명 : data structure
 * 교수님 : 유하진 교수님
 *
 *************************************************************************************************************/


#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef struct
{
 char name[10];
 int id;
 float math;
 float english;
} student;

void main(int argc, char *argv[])
{
 student students[10];
 FILE *fp;
 int sNum, i;
 float totalMath = 0, totalEng = 0;

 fp = fopen("data.txt", "r");  // 파일을 읽기 전용으로 open
 fscanf(fp, "%d\n", &sNum);

 for(i = 0 ; i < sNum ; i++)
 {
  fscanf(fp, "%s\n", &students[i].name);
  fscanf(fp, "%d\n", &students[i].id);
  fscanf(fp, "%f\n", &students[i].math);
  fscnaf(fp, "%f\n", &students[i].english);
  printf("이름 : %s\n", students[i].name);
  printf("학번 : %d\n", students[i].id);
  printf("수학 : %.2f\n", students[i].math);
  printf("영어 : %.2f\n", students[i].english);
  totalMath += students[i].math; totalEng += students[i].english;
 }

 printf("\n수학 평균 : %.2f\n", totalMath / sNum);
 printf("영어 평균 : %.2f\n", totalEng / sNum);



}

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요