구조체 메모리 할당관련된 질문입니다.
두빛나래
struct person{int age;char name;char *phone;}human;이라는 구조체가 있을 시 메모리는 가장 큰 메모리를 기준으로 할당한다고 알고 있습니다.예를 들어 현재 sizeof(human)를 하게 되면 4byte(int)+1byte(char)+1byte(char) = 6byte가 아니라4byte를 기준으로 삼아 12byte가 나온다고 알고 있습니다.(확인함)그런데 제가 * phone을 포인터가 아니라 phone으로 변경하니깐 struct person{int age;char name;char phone;}human;8byte가 나오더라고요. 왜 그런거죠??
-
달님
설마.. double형 뒤에 char형이 나왓으니 기준이 8byte로 바뀌어서
■■□□ ■■■■ ■■■■ ■■■■ ■□□□ □□□□
이렇게 되는건가//? -
곰돌츼
한가지 더 질문드리자면 꼭 4byte기준인가요?? 고정이 아니구 기준이요. 예를 들어
short char int double순으로 선언 후 sizeof를 하면 16byte나오네요.
■■■□ ■■■■ ■■■■ ■■■■
short int double char 순으로하면 24byte가 나옵니다.
■■□□ ■■■■ ■■■■ ■■■■ ■□□□
제 생각이 맞는건지..
어라;;; 20byte인데 ;; 모지 ㅜㅜ -
도도
그럼 구조체에 자료형을 어떠한 순으로 하느냐에 따라 공간 활용을 유동적으로 할 수 있는지 알 수 있는 반면에 이러한 점까지 고려해서 코딩을 해야하는 복잡함이 있겠네요... 참 C언어라는게 잘만들었네 ㅜㅜ
-
흰여울
네네 정확히는 ■■■■ ■■□□ 이렇게 되겠네요.
만약
struct person
{
int age;
char name;
char phone;
int temp;
};
이런 구조체라면 ■■■■ ■■□□ ■■■■ 이렇게 되는 거구요~ -
찬바리
답변 감사합니다. 님께서 해주셔서 이해가 쉽네요ㅎ 그럼 정리해보면
■■■■ ■□□□ ■■■■처음을 이렇게 정리할 수 있겟죠?(힌공간은 Empty block)
■■■■ ■□■□ 두번째는 이렇게 나열 될 수도 있다?라는 말씀이신가요?? -
그리
4byte란 크기는 고정이 아니에요. #pragma pack 이란 명령어나 프로젝트 속성 [구조체 맴버 정렬] 에서 크기를 바꿔줄수 있어요.
-
Loseless
두번째 구조체가 8byte가 나오는건 변수당 무조건 4byte로 잡는게 아니기 때문에요. 처음에 int로 4btye할당하고 char변수 1byte, 그리고 다시 char 변수 phone을 잡을때 name에서 1byte 사용하고 3만큼 남은 공간에 phone이 들어갈 수 있자나요. 그래서 연속으로 메모리에 잡아줘요. 즉, name, phone을 잡고 4를 채워준다 해야 하나.. 흠.. 저도 설명은 잘 못하겟네요.. 설명은 다른분이 해주실꺼라 믿으면서~
-
민트
우선 첫번째 계산이 잘 못 되었네요. 마지막 char* phone는 포인트 변수로 1byte가 아니고 4byte에요.
4byte(int)+1byte(char)+4byte(char *) = 9byte 이지만 말씀하신대로 4byte가 기준이기 때문에 12byte가 나오는건 맞구요.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692510 | 함수형 중에서.. (6) | 한란 | 2025-04-23 |
2692483 | C언어 함수, Header | 떠나간그놈 | 2025-04-23 |
2692451 | 이 문제좀 풀어주세요 ^^ | 게자리 | 2025-04-23 |
2692424 | 2차원배열 자료입력질문이요! (1) | 똘끼 | 2025-04-22 |
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |