본문 바로가기
: ) C언어

바이트수 할당이 어려워요

by miiinn 2022. 5. 29.

#define SIZE 30

일 때

 

Place구조체가 28바이트

 

char buf[SIZE]; 를 하면 30바이트가 잘 할당된다.

 

그러나

 

char *buf = (char*)malloc(sizeof(Place)+1); (X)

char *buf = (char*)malloc(sizeof(SIZE)); (X)

char *buf = (char*)malloc(sizeof(char)*30); (X)

위의 경우들은 모두 8바이트가 나온다... 왜지..

 


실험

 

위의 출력 결과는

배열이랑 동적 할당이랑 다르게 동작하는건가...

우선 출력결과로 봐서 malloc에 30이 들어가면 8바이트가 할당됨을 확인했다.

 

sizeof 때문인 것 같은데

 

30이라는 십진수가 ?

 

//////////////

아니 진짜 첫번째 줄은 바보같은 짓이었다.

sizeof(char*) 이 뭐람?! 근데 문제는 이게 아니었고

 

 

아....? 공간이 할당 됐어도 list 자체가 포인터니까 다 8바이트로 나오는듯?!!?!? 

 

응 아니었고. 그냥 공간 할당이 8바이트밖에 안됨,

 

음? 근데 Stack Overflow보니까 포인터라더 8바이트로 나오는게 맞는듯 근데 왜 공간할당도 8만 된걸까

https://stackoverflow.com/questions/35470661/why-is-malloc-giving-me-8-bytes-when-i-request-20

 

이유를 찾았다.

sizeof(initbuf) 는 자료형이 char *여서 계속 포인터의 크기가 나왔던 것이고

 

fwrite에도 계속 똑같이 sizeof(initbuf)를 했어서 30만큼 공간이 할당됐어도 그냥 8만큼만 써진거다.

 

sizeof(30) 으로 하니까 또 4바이트가 나온다.

그래서 그냥 30씩 읽는걸로 하니까 드디어 잘 나온다.

 

 

 

잘 되는 케이스. malloc(30) 해도 잘 나온다

 

memset함수는

void* memset(void* ptr, int value, size_t num);

이기 때문에 영향이 딱히 없다.  응 아니다.

파일 열어보니까 memset도 sizeof(30)이 아니라 30을 써야 잘 되는 것 같다. 아니 대체 왜

근데 왜 malloc은 sizeof(30)이 잘 먹히냐고ㅇ.

 

 

그런데 

아마 fwrite의 함수 원형을 보면

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

음 이것도 size_t형인데

fwrite에 30 대신 sizeof(30)을 넣는 순간 4밖에 안돼버린다 하하 ㅋ ㅎ

 

동적할당은 버퍼로 쓸 수 없는건가..... 하아 물론 당연히 쓸 수는 있겠지

 

근데 이렇게 복잡한거 보면 굳이?. 실수하기 쉬울 것 같다. ..

 

그리고 malloc은 얼만큼이 할당되어있는지 sizeof로 볼 수 없어서 헷갈릴듯..

': ) C언어' 카테고리의 다른 글

쓰레기값 주의  (0) 2022.05.29
PL과제3  (0) 2022.05.29
리눅스 우분투 명령 프롬프트 변경하기  (0) 2022.03.17