개인공부/C언어(71)
-
C언어 - 정적 변수의 외부연결 (external linkage), 내부연결 (internal linkage)
외부연결 번역단위(translation unit) : 대부분의 경우 파일. (c 파일) 컴파일러가 컴파일 할때는 c파일 단위로 한다. 따로 obj파일을 만들고 실행파일을 만들기 전에 각 obj를 linking 한다. 변수말고도 함수도 연결해준다. int g_int; int main(){ extern int g_int; // 파일안에 main()함수 밖의 g_int를 쓴다. // 내부변수로 인식안함 //extern int_int = 1024; //block scope 에러 //int g_int =123; // 밖의 global변수 g_int를 가려버려 지역변수 g_int를 쓴다. return 0; } extern으로 외부 변수를 불러올때 자료형을 붙여주지 않아도 된다. 이미 선언될때 자료형까지 다 붙어서 ..
2020.11.13 -
C언어 - 블록 영역의 정적변수
Static with no linkage는 블록안에서만 사용할수 있다. (블록안에서만 볼수있는것) void count() { int ct = 0; // count()함수가 호출될때마다 초기화가 된다. printf("count = %d %lld\n", ct, (long long)&ct); ct++; } void static_count() { static int ct = 0; // 초기화 한번만 한다! printf("static count = %d %lld\n", ct, (long long)&ct); ct++; } #define _CRT_SECURE_NO_WARNINGS #include /* Automatic storage class -Automatic storage duration, block scope,..
2020.11.13 -
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