몽상실현개발주의

[따배씨] 12.3 변수의 영역과 연결 상태, 객체의 지속 기간 본문

Language/C

[따배씨] 12.3 변수의 영역과 연결 상태, 객체의 지속 기간

migrationArc 2021. 6. 13. 15:44

[따배씨] 12.3 변수의 영역과 연결 상태, 객체의 지속 기간

따배씨 - 따라하며 배우는 C언어

12강 Storage Classes, Linkage and Memory Management

12.3 변수의 영역 Scope 과 연결 상태 Linkage, 객체의 지속 기간 Duration

#include <stdio.h>

/*
    Variable scopes (visibility)
    - block, function, function prototype, file.
 */


// file scope
int g_i = 123;  // global variable
int g_j;      // global variable


void func1(){
    g_i++;  // uses g_i
}

void func2(){
    g_i += 2;  // uses g_i
    
    // local = 456; // Error
}

int main(){
    // main function scope
    int local = 1234;
    
    func1();
    func2();
    
    printf("%d\n", g_i);    // uses g_i
  	// 126
    printf("%d\n", g_j);    // Not initialized
  	// 0
    printf("%d\n", local);
  	// 1234
    
    return 0;
}
printf("%d\n", g_j);    // Not initialized
// 0
    • 초기화 되지 않은 정적 변수는 BSS 메모리 공간에 저장되고, 프로그램이 시작 될 때 모두 0으로 초기화
      • 효율을 위해 일괄 처리
      • BSS (Block Started by Symbel): 전역으로 선언된 초기화 되지 않은 데이터 영역

 

#include <stdio.h>

/*
    Variable scopes (visibility)
    - block, function, function prototype, file.
 */


// function prototype scope
void f1(int hello, double world);   // to the end fo the protoytpe declaraion
// void vla_param(int n, int m, double ar[n][m]);   // gcc only

// functin scope
double func_block(double d){
    double p = 0.0;
    
    int i;
    for (i = 0; i < 10; i++){
        double q = d * i;
        p *= q;
        
        if (i == 5)
            goto hello;
    }
hello:
    printf("Hello, world");
    return p;
}

int main(){
    func_block(1.0);
}

void f1(int hello, double wold){
    
}
    •  
double func_block(double d){
    double p = 0.0;
    
    int i;
    for (i = 0; i < 10; i++){
        double q = d * i;
        p *= q;
        
        if (i == 5)
            goto hello;
    }
hello:
    printf("Hello, world");
    return p;
}
  • goto 문은 동작을 위해 자동으로 function scope 로 범위가 확장
  • block scope 는 function scope와 비슷하나, function 을 선언하지 않아도 block만 지정하면 block scope 가능

 

 

 

// main.c
#include <stdio.h>

/*
    Linkage
 
    Variables with block scope, function scope, or function prototype scope
    - No linkage
 
    File scope variables
    - External or internal linkage
 */

int el;             // file scope with external linkage (global varible)
static int il;      // file scope with inernal inkage

void testLinkage();

int main(){
    el = 1024;
    
    testLinkage();
    
    printf("%d\n", el);
  	// 1025
    
    return 0;
}

/* ------------------------- */
// second.c
#include <stdio.h>

extern int el;      // 다른 파일에 선언한 변수를 사용
// extern in il;

void testLinkage(){
    printf("DoSomething called\n");
    // DoSomething called

    printf("%d\n", el);
    // 1024
    
    //printf("%d\n", il);
    //printf("%d\n", dodgers);
    
    el++;
}
extern int el;
  • extern 선언으로 다른 파일에서 선언한 file scope 변수를 호출 가능
static int il;
  • 현재 file scope 로 scope 제한
    • 다른 file 에서 extrn으로 사용 하려고 할 시, link error 발생

 

 

#include <stdio.h>

/*
    Storage duration: // duration : 메모리의 지속기간
    - static storage duration       // 프로그램이 시작될때 부터 끝날때 까지 메모리를 유지
    (Note : 'static' keword indicates the linkage type, not the storage duration)
    - automatic storage duration    // 일반적으로 지역변수, scope 에 따라서 메모리 사용
    - allocated storage duration    // 동적할당
    - thread storage duration       // Multi Threading - 고급프로그래밍 기술
 */

void count()
{
    int ct = 0;
    printf("count = %d\n", ct);
    ct++;
}

void static_count(){
    static int ct = 0;
    printf("static count = %d\n", ct);
    ct++;
}

int main(){
    count();
    // count = 0
    count();
    // count = 0
    static_count();
    // static count = 0
    static_count();
    // static count = 0
    
    return 0;
}
void static_count(){
    static int ct = 0;
    printf("static count = %d\n", ct);
    ct++;
}
  • 함수 scope 에서 static 으로 선언한 변수는 static storage duration
    • 프로그램이 시작 될 때 메모리가 할당되고, 프로그램이 끝날 때 까지 메모리가 유지

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

Comments