목록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는 선언한 함수나 블록 내..

메모리 레이아웃에서 데이터 영역은 두가지로 나누어진다. 일반적으로 Data 영역은 초기화된 전역 변수들과 정적 변수들이 저장되는 영역이다. BSS(Block Started by Symbol) 영역은 초기화되지 않은 전역 변수들과 정적 변수들이 할당되는 영역이다. 초기화된 변수들이 있는 Data 영역은 값을 설정하고 메모리에 저장해둔다. 하지만 BSS 영역은 프로그램 시작 전에 메모리에 할당할 필요는 없기에, 데이터의 크기만 저장해뒀다가 프로그램이 시작되고 모두 0으로 초기화해준다. 즉 프로그램 영역은 BSS를 제외한 Text, Data 영역이 된다. 출처 : ACE Lab 프로그램이 실행되면 Secondary Memory, ROM에서 텍스트와 데이터를 Main Memory, RAM 으로 옮긴다. 위 코드..
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번의 경우 ..