목록C (4)
개발자 최승준

C언어에서 구조체의 크기는 변수들의 타입 값의 합일까? 아니다. 만약 그림 첫번째 구조체가 그대로 메모리 상에 배치된다면, (int는 4바이트, short는 2바이트 환경인 32비트 컴퓨터로 가정하자) 1바이트 (char) + 4바이트 (int) + 1바이트 (char) + 2바이트(short) = 8바이트 총 8바이트가 되어야 할 것이다. 하지만 Memory Alignment 로 인해서 padding이 생기고, 1바이트 (char) + 3바이트(padding) + 4바이트(int) + 1바이트(char) + 1바이트(padding) + 2바이트(short) = 12바이트 총 12바이트가 된다. 왜 이럴까? 만약 char a 옆에 int b를 배치해서, int 자료형의 배치가 두개의 주소층으로 나눠진다면..

변수는 scope(유효 범위), life time(유효 시간)으로 나눠서 판단할 수 있다. 전역 변수와 정적 변수는 데이터 영역에 저장된다. 메모리 데이터 영역에 프로그램 시작시에 저장되고 프로그램 종료시에 메모리 영역에서 해제되므로 변수의 life time은 프로그램 시작과 종료이다. 반면 지역 변수는 함수에서 선언되고 스택에 저장된다. 메모리 스택 영역에는 각 함수의 프레임이 저장되고, 함수 호출이 종료되면 스택에 할당되있던 함수 메모리 영역이 해제되므로 지역 변수의 life time은 함수의 실행부터 종료될 때까지이다. 전역 변수의 scope는 프로그램 전체에서 통용된다. 단, 다른 파일에서 전역 변수에 접근하기 위해서는 extern 선언이 필요하다. 지역 변수의 scope는 선언한 함수나 블록 내..
C언어에서 문자열을 사용할 때 2가지 방법을 사용해서 다룬다. char s[] = “hello”; char *s = “hello”; 위의 “hello\0”는 상수 값이므로 메모리에서 텍스트 영역에 저장되어 있다. 1) 코드가 실행되면 함수에서 s라는 지역변수를 생성하면 스택에 할당되고, 스택 프레임에 s가 생성되며 memcpy를 통해 텍스트 영역에 저장되어 있던 “hello\0”가 할당된다. 2) 코드가 실행되면 동일하게 지역변수가 생성되고, “hello\0”가 저장되어 있는 텍스트 영역에 주소가 포인터 s에 저장된다. 만약 s[0] = ‘t’; 를 실행한다면 1,2에서 어떤 변화가 일어날까? 아무 문제 없이 h가 t로 변경된다. 저장된 주소에 있는 값에 t를 할당을 시도하게 된다. 그런데 2번의 경우 ..
C++에서 포인터와 레퍼런스(참조)는 모두 변수나 객체의 메모리 주소에 접근하는 방법을 제공하지만, 몇가지 차이가 있습니다. 1. Nullability(Null이 될 수 있는지 여부): 포인터는 NULL 값을 가질 수 있습니다. 이것은 포인터가 아무것도 가리키지 않을 수 있다는 것을 의미합니다. 반면에 참조는 반드시 어떤 객체를 참조해야 하며 NULL 값을 가질 수 없습니다. int* p = NULL; // 유효 int& r = NULL; // 컴파일 오류 2. Reassignment(재할당): 한번 초기화된 후에는 참조는 다른 객체를 참조하도록 변경할 수 없습니다. 반면에 포인터는 언제든지 다른 주소를 가리키도록 변경할 수 있습니다. int x = 5, y = 10; int* p = &x; // x의 ..