C를 쓰는 곳으로 이직해서 c 언어를 공부하게됐다.
그래서 c 에 대해서 정리해보려고 한다.
1. 프로그래밍 패러다임
- C언어:
- 절차지향 언어로, 프로그램이 순차적인 명령어의 흐름에 따라 실행된다.
- 객체지향 개념이 없으며, 함수와 데이터가 분리되어 있다.
2. 메모리 관리
- C언어:
- 메모리 관리를 프로그래머가 직접 수행해야 한다.
- 동적 메모리 할당(malloc, calloc)과 해제(free)를 통해 메모리를 제어.
- 스택(stack)과 힙(heap)을 직접 다룬다.
- 메모리 누수나 잘못된 접근(세그멘테이션 오류)이 빈번히 발생할 수 있음.C 언어 기초 학습 정리
1. 구조체(Structure) - 기본 구조와 선언 방법
C 언어 기초 학습 정리
1. 구조체(Structure)
기본 구조와 선언 방법
typedef struct {
char name[50]; // 문자열 배열 멤버
int age; // 정수형 멤버
} User;
- 구조체는 서로 다른 데이터 타입을 하나로 묶어서 관리
- Java의 클래스와 비슷하지만, 메서드는 포함할 수 없음
2. 포인터와 메모리 연산자
주요 연산자
- * (포인터): 메모리 주소를 저장하는 변수
- & (주소): 변수의 메모리 주소를 가져옴
- -> (화살표): 포인터로 구조체 멤버 접근
User user; // 일반 구조체 변수
User *userPtr = &user; // 구조체의 주소를 포인터에 저장
userPtr->age = 25; // 포인터로 멤버 접근
일반 구조체 변수에 접근 → . 사용:
User user;
user.age = 25; // 일반 변수에 접근
3. 동적 메모리 관리
malloc과 free
// 메모리 할당
User *user = (User *)malloc(sizeof(User));
// 메모리 사용
user->age = 25;
// 메모리 해제
free(user);
4. 차이점 정리
상황포인터 저장이 필요한 경우포인터 저장이 필요 없는 경우
| 동적 메모리 사용 | malloc으로 동적 메모리를 생성하지 않는 경우: | malloc으로 동적 메모리를 생성한 경우: |
| 기존 구조체 주소를 수동으로 포인터에 저장해야 함: | malloc 자체가 주소를 반환하므로 따로 주소 저장이 필요 없음: | |
| 예제 | ```c | ```c |
| User existingUser; | User *user = (User *)malloc(sizeof(User)); | |
| User *userPtr = &existingUser; | ||
4. 문자열 처리
문자열 복사 함수
strncpy(user->name, name, sizeof(user->name));
- strncpy: 안전한 문자열 복사
- sizeof: 배열/변수의 크기 확인
- 문자열 끝에 '\0' (널 문자) 필요
5. 출력 형식 지정자
printf 사용법
printf("Name: %s\n", getName(user)); // 문자열 출력
printf("Age: %d\n", getAge(user)); // 정수 출력
주요 형식 지정자
지정자용도예시
| %s | 문자열 | "Hello" |
| %d | 정수 | 42 |
| %c | 문자 | 'A' |
| %f | 실수 | 3.14 |
6. main 함수 반환값
올바른 main 함수 선언
int main() {
// 프로그램 코드
return 0; // 정상 종료
}
- 반드시 int 타입으로 선언
- return 0: 정상 종료
- 다른 값: 에러 코드
주의사항
- void main()은 표준이 아님
- 운영체제에 프로그램 종료 상태를 알리기 위해 int 사용
7. 데이터 타입
C 언어에서 자주 사용하는 기본 데이터 타입과 크기를 정리해보세요:
타입설명크기(일반적으로)
| char | 문자형 (1바이트) | 1 byte |
| int | 정수형 | 4 bytes |
| float | 단정밀도 실수형 | 4 bytes |
| double | 배정밀도 실수형 | 8 bytes |
| void | 반환값이 없거나 자료형 없음 | - |