본문 바로가기

프로그래밍 언어 개념/C

(5)
구조체 패딩(struct padding) 구조체 패딩 현상은 무엇일까? 성능 향상을 위해 CPU가 접근하기 쉬운 메모리에 구조체 필드를 배치하는 것이다. 예를 들어 그림1과 같이 구조체가 선언되었다면 해당 구조체의 크기는 9byte가 나올 것 같지만 실제로는 16byte가 나온다. 그 이유는 CPU가 접근하기 쉽게 구조체에 패딩 값을 넣어주는 구조체 패딩 현상이 일어났기 때문이다. 구조체 패딩 현상은 왜 일어날까? 64bit 운영체제일 때 CPU는 8byte씩 메모리를 읽어온다. 따라서 64bit 운영체제에서 그림1 구조체의 ll을 읽어오기 위해서는 그림2처럼 2번의 접근이 필요하다. 이런 경우 CPU가 접근하기 쉽게 구조체에 패딩 값을 그림3처럼 넣어주게 되는데 패딩 비트 크기만큼 메모리를 낭비하게 되지만 CPU가 그림1 구조체의 ll을 읽어..
[C언어] 함수의 정의 함수의 선언만 있고 정의 부분은 삭제한 위와 같은 코드가 있습니다. 이 코드를 컴파일 하면 오류가 발생하지 않는데, 그 이유는 컴파일러는 함수의 정의를 의심하지 않기 때문입니다. 컴파일러는 함수가 어떤 매개 변수와 반환형을 가지는지 파악하여 문법이 올바른지 판단하고, 함수의 정의는 어딘가에 있다고 생각하고 넘어갑니다. 하지만 이 프로그램은 컴파일은 가능하지만 실행할 수는 없습니다. 그 이유는 소스코드 파일을 실행 가능한 소프트웨어로 만드는 빌드 과정에서 함수를 호출했을 경우 이동할 함수의 정의 부분을 찾을 수 없기 때문입니다. 그래서 함수의 정의 부분을 넣어줘야 하는데 어디든 존재하기만 하면 됩니다. 그것이 DLL 파일이든, LIB 파일이든 상관없이 어디든 그 함수의 정의가 존재한다면 그 곳으로 이동할 ..
[C언어] Strcpy 함수 주의할 점 [strcpy 함수의 사용 예제] 아래의 코드를 보고 결과를 예측해보자. #include void main() { char ori_arr[] = "ABCDEFG"; char cpy_arr[] = "AAA"; strcpy(ori_arr, cpy_arr); printf("%s", ori_arr); return 0; } [실행 결과] AAA [예측] 코드를 보면 ori_arr이 cpy_arr보다 길이가 더 긴 물자열이다. 따라서 저렇게 복사하면 "AAADEFG"이 나올 것으로 예측하기 쉽다. [결론] strcpy는 문자열의 끝('\0')까지 복사를 한다. strcpy 함수를 통해서 ori_arr에 cpy_arr을 복사하게 되면, ori_arr은 메모리 상에서 아래와 같이 된다. "AAA\0EFG\0" 즉, s..
[C언어] static 변수 전역변수와 지역변수 모두에 static 선언을 추가할 수 있다. 그러나 여기서는 지역변수의 static 선언에 대하여 설명하고자 한다. 1. 지역변수와 지역변수에 static 선언이 붙는 경우 차이점 지역변수 특성 1) 선언된 함수 내에서만 접근이 가능하다. 2) 함수 내에 선언된 지역변수는 해당 함수가 반환하면 소멸된다. 지역변수에 static 선언이 붙는 경우 특성 1) 선언된 함수 내에서만 접근이 가능하다. 2) 프로그램 시작과 동시에 할당 및 초기화 된다. 3) 딱 1회 초기화되고 별도의 초기화 조건이 없으면 0으로 초기화된다. 4) 프로그램 종료 시까지 메모리 공간에 존재한다. 2. 예제 코드 및 분석 그림1의 실행결과를 보면 static변수(num1)는 계속해서 메모리에 존재하기 때문에 값이 ..
[C언어] 지역변수와 전역변수 지역변수 1. 지역변수의 특징 1) 선언된 지역 내에서만 유효하다. 2) 중괄호 내에 선언되는 변수이다. 3) 선언된 지역을 벗어나면 소멸된다. 2. 예제 코드와 실행 흐름 #include int SimpleFuncOne(void) { int num = 10; // 이후부터 SimpleFuncOne의 num 유효 num++; printf("SimpleFuncOne num: %d \n", num); return 0; // SimpleFuncOne의 num이 유효한 마지막 문장 } int SimpleFuncTwo(void) { int num1 = 20; // 이후부터 num1 유효 int num2 = 30; // 이후부터 num2 유효 num1++, num2--; printf("num1 & num2: %d ..