본문 바로가기

프로그래밍/C67

size_t 와 unsigned int 형의 차이 size_t 는 부호 없는 정수로서 포인터나 메모리의 크기를 나타내는 데 사용되는 데이터 타입이다. stddef.h 헤더 파일에서 정의되어 있으며 플랫폼에 따라 그 정의가 달라진다. 일반적으로 32비트 아키텍처에서는 unsigned int로 정의되고, 64비트 아키텍처에서는 unsigned long long 으로 정의된다. sizeof() 함수를 사용해서 size_t 타입의 크기를 확인해보자. Visual Studio에서 프로젝트 빌드 구성을 x86으로 하면 4 byte, x64로 선택하면 8 byte로 확인된다. 아래 사이트에서도 확인 가능하다. https://www.ibm.com/docs/ko/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-ref-dev-doc-q104610.. 2022. 4. 24.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 지난편에 이어 도서 삭제기능을 동적할당을 사용한 버전으로 바꿔보자. 2022.04.12 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 처음으로 돌아가서 삭제기능은 먼저 검색을 수행하고 검색결과를 출력해서 보여준 뒤 삭제할지 말지 선택을 입력받고 삭제하게 해야했다. 그럼 삭제함수 안에서 검색함수를 호출해야하고 그 검색결과가 담긴 데이터가 필요한데 여기서 문제가 있다. 일반적으로 검색함수 내에서 변수(배열)를 선언하면 그 지역변수는 함수를 빠져나오면서 소멸된다. 하지만 내가 필요한 검색결과가 담긴 변수의 수명은 검색함수의 시작과 끝을 함께하면 안된다. 삭제함수가 필요할 때 생성되고 삭제후 필요없어지면 사라져도 되는데 이런상황을 위해 동적할당이 .. 2022. 4. 22.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 동적 메모리 할당을 적용한 도서 관리 프로그램 개선 3탄. 2022.04.17 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 이전 까지는 #define을 통해 구조체 배열인 booklist의 SIZE를 20으로 고정했었다. 하지만 동적 메모리 할당을 한번 해보니 더 본격적으로 써보고 싶어진다. 도서가 계속 추가 되어 배열이 꽉 찬다면 배열의 크기를 늘리고 싶고 데이터가 줄어들어 빈공간이 널널한다면 배열을 다시 축소하고 싶은데 어떻게 하면 될까? 참고로 배열을 선언할 땐 대괄호 안에 변수를 넣을 수 없다. 선언한 뒤 사용할 때는 인덱스 자리에 변수를 넣어서 활용 할 수 있지만 선언 할때 변수를 넣으면는 위와 같이 C2466 에러가 난다... 2022. 4. 22.
구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결 구조체의 크기가 생각과는 달라서 당황했던 적이 있는데 구글링을 통해 쉽게 답을 찾았다. 위 구조체의 size는 1 byte가 맞다. 하지만 구조체 안에 여러 자료형이 들어있으면 어떻게 될까? #include typedef struct { char a;// 1 byte int b;// 4 byte double c;// 8 byte } TEST; int main(void) { TEST test; printf("구조체멤버 a의 크기 : %d\n", sizeof(test.a)); printf("구조체멤버 b 크기 : %d\n", sizeof(test.b)); printf("구조체멤버 c 크기 : %d\n", sizeof(test.c)); printf("구조체 test 크기 : %d\n", sizeof(TEST).. 2022. 4. 20.
64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까? char* p1; int* p2; double* p3; printf("%d\n", sizeof(p1)); printf("%d\n", sizeof(p2)); printf("%d\n", sizeof(p3)); 분명 수업에서 들었을 때는 8바이트가 나올거라고 했는데 실제 위와같이 코드를 치고 실행해보니 4바이트 라고 나왔다.. 열심히 검색해보니 이유는 내가 사용하는 Visual Studio에서 32비트 용으로 컴파일 하기 때문.. 솔루션 플랫폼을 x86이 아니라 x64로 바꿔주면 8바이트라고 제대로 뜬다. 그리고 리눅스 64비트 환경에서도 gcc로 컴파일 하니 8바이트라고 떴다. 주소값도 16진수로 16자리나 된다. 결론은 내가 개발하고 있는 pc의 환경이 아니라 어느 플랫폼을 대상으로 컴파일하냐에 따라 포인.. 2022. 4. 14.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 book.h #ifndef __BOOK_H__ #define __BOOK_H__ #define SIZE 20 typedef struct { char year; char month; char day; }_stDate; typedef struct { char title[30]; int price; char author[10]; int page; _stDate date; } _stBook; char DispMenu(char num); char CountData(_stBook list[]); char AddBook(_stBook list[], char num); void PrintBook(_stBook list[], char num); char RmBook(_stBook list[], char num); voi.. 2022. 4. 12.
[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) 1. stdlib.h, time.h 헤더파일 포함하기 #include #include 2. 메인함수 안쪽 상단에 srand((unsigned)time(NULL)); 를 한번만 사용 srand((unsigned)time(NULL)); 진정한 의미의 난수생성을 위해 time을 seed값으로 넣어주는 부분, 간혹 컴파일 에러가 뜨는 경우가 있어 unsigned로 캐스팅해준다고 한다. 3. rand() 함수와 % 나머지연산자를 활용하여 랜덤값 생성 예를들어, 0~9 사이의 난수생성을 원한다면 rand()%10 1~10 사이의 난수생성을 원한다면 (rand()%10)+1 4. 중복없이 난수 뽑기 만약 뽑아야할 난수의 갯수가 많지 않다면 이런 방법도 있다. for (;;) { a = rand() % 10; b = .. 2022. 4. 4.