#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씩 읽는걸로 하니까 드디어 잘 나온다.
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형인데
동적할당은 버퍼로 쓸 수 없는건가..... 하아 물론 당연히 쓸 수는 있겠지
근데 이렇게 복잡한거 보면 굳이?. 실수하기 쉬울 것 같다. ..
그리고 malloc은 얼만큼이 할당되어있는지 sizeof로 볼 수 없어서 헷갈릴듯..
': ) C언어' 카테고리의 다른 글
쓰레기값 주의 (0) | 2022.05.29 |
---|---|
PL과제3 (0) | 2022.05.29 |
리눅스 우분투 명령 프롬프트 변경하기 (0) | 2022.03.17 |