분류 전체보기(139)
-
C언어 - 저장공간의 다섯가지 분류 , 자동변수, 레지스터 변수
//BSS는 block started by symbol의 약어이다. .bss나 bss는 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부로 컴파일러나 링커에 의해 사용된다. 즉, 초기화되지 않은 전역 데이터를 위한 영역이다 5가지 분류 1.자동 2.레지스터 3.고정적, 내부연결 4. 고정적, 외부연결 5. 고정적, 연결없음 2가지 분류 non-static 1.자동 2.레지스터 static 3.고정적, 내부연결 4. 고정적, 외부연결 5. 고정적, 연결없음 데이터 또는 BSS, 고정적. 고로 프로그램이 시작과 끝까지 메모리에 끝까지 자리한다. register는 cpu에 자리한다. 할당메모리 운영체제에게 큰 공간이 필요한데 어느정도의 크기인지 확실하지 않음. 운영체제는 포..
2020.11.13 -
C언어 - 변수의 영역과 연결 상태, 객체의 지속 기간
#define _CRT_SECURE_NO_WARNINGS #include /* *Variable scopes (Visibility) *- block, function, function prototype, file. * *function prototype은 프로토타입 선언동안. * *function scope( function() 가 block scope{} 처럼 보이기도 한다. * * file 영역은 함수영역 바깥에 선언되면 된다. */ int g_i = 123;//global variable 전역변수 int g_j;// global variable 전역변수 void func1() { g_i++; } void func2() { g_i += 2; } int el;//file scope with extern..
2020.11.13 -
C언어 - 객체(Object)와 식별자(Identifier) , L-value R-value
Object란? 값을 저장할수 있는 메모리 덩어리이다. Object는 C++에서 더 발전된 의미를 가진다 그리고 객체지향이다 (OOP) Identifiers (식별자) - 변수, 함수, 매크로 그리고 엔티티를 위한 이름이다. int var_name = 3; 변수이름을 통해서 접근하는 메모리 공간이 Object 변수 이름 var_name 이 Identifier(식별자) int var_name =3 ; //creates an object called 'var_name'. int* pt = &var_name; // pt는 식별자이다. 포인터 변수도 자기주소를 가진다. 다른 변수의 주소 '값'을 저장할뿐 *pt = 1; // *pt 는 식별자가 아니다. *pt는 object를 지명한다(가르킨다). (indire..
2020.11.12 -
C언어 - 메모리 레이아웃 훑어보기
function pointer는 함수 자체의 주소 함수 자체에도 메모리에 저장되어있다. 함수의 주소도 가져올수 있다. 프로그램 코드 자체도 메모리에 올라와야 하고 한번 메모리에 올라오면 프로그램이 끝날때까지 올라와있어야한다. 전역변수는 빨간 박스 안에 들어가있고 프로그램이 끝날때까지 계속 메모리에 머물러 있다. 어떤 프로그램이 어떤 메모리를 쓰고 있다면 다른곳에서 메모리를 쓰지 못하게 막는다. 하지만 프로그램이 쉬고있는 경우 다른 프로그램이 쓸수 있도록 내어줄수있어야 한다.(효율성) 초보입장에선 자신이 쓸 메모리를 항상 쓸수 있게 모든 변수를 전역변수로 선언해버리는것 지역변수는 스택이라는 다른 메모리에 저장된다. 지역변수가 쓰일때만 쓰이고, 쓰이지 않을땐 스택에서 빠진다. 스택은 늘어났다가 불필요하면 줄..
2020.11.12 -
C언어 - 메모리 레이아웃과 문자열 (Memory Layout )
지역변수들이 stack에 쌓인다. 컴파일러가 미리 크기를 알수 있다면 미리 준비를 할수있다. 메모리 크기가 얼마될지 예상이 안될경우 heap이라는 메모리를 사용한다. 초기화된 전역/정적 변수들은 변수들이 어떻게 초기화가 되어야 할지를 미리 알고있다. 컴파일할때 이미 결정되어있기 때문에, 프로그래밍 한 값으로 바로 값이 결정됨 초기화되지 않은 전역/정적 변수들은 0으로 초기화. arr배열자체가 메모리를 가지고 있으니 값을 얼마든지 바꿀수있음. char* str = "Hello, World"; str 포인터는 "Hello, World" 스트링 리터럴이 저장되어 있는 공간을 바꿀 방법이 없다. 문자열 리터럴들은 컴파일때 이미 값이 정해져있다. 읽기 전용으로 들어감. 읽기전용에서 쓰기를 시도하니 운영체제에서 막..
2020.11.12 -
C언어 - 문자열을 정의 하는 방법
남는 공간에 null character를 채워준다. #define _CRT_SECURE_NO_WARNINGS #include #define MESSAGE "A symbolic string contant" #define MAXLENGTH 81 int main() { char words[MAXLENGTH] = "A string in an array"; // char 타입의 배열 // 배열자체가 메모리를 가지고 있다. const char* pt1 = "A point to a string."; // 문자열에 대한 포인터 // 포인터는 어딘가에 저장되어있는 것의 첫번째 주소를 가져오는 것 //puts 함수는 문자열을 출력 puts("Puts() adds a newline at the end:"); // puts(..
2020.11.12