'c language'에 해당되는 글 1건

  1. 2012.01.07 c언어의 메모리 구조
c language2012. 1. 7. 17:26
#include <stdio.h>

void fct1(int );
void fct2(int);

int a=10;
int b=20;

int main (void)
{
int m=123;

fct1(m);
fct2(m);
return 0;
}

void fct1(int c)
{
int d= 30;
}
void fct2(int e)
{
int f=40;
}
--------------------------------------------------------------------------------------
전역변수 가 프로그램이 종료 될때까지 종료되는 이유
데이터 영역에 있기 때문에 

main 함수는 시스템에 의해서 자동적으로 호출된다는 점을 제외하면 사실상 일반 함수와 차이가 없다

변수 m도 main 함수 내에서 선언 되었으므로 지역 변수다
지역 변수는 함수가 호출되어 실행되는 동안에만 유효한 변수이다
main 함수가 완료되면 지워져 버린다

void fctl(int c) 와 같은 함수 내에 선언된 변수도 지역변수다

스택의 중요한 특징
함수 호출시 할당 되었다가 함수 호출이 완료 되면 사라져 버린다

main의 완료는 프로그램의 종료를 의미하므로 데이터 영역도 완전히 지워지고 프로그램은 종료하게 된다

------------------------------------------
배열 선언 시 반드시 상수만 써야 하는 이유
--
스택과 데이터 영역에 할당될 메모리의 크기는 컴파일 동안에 결정되어야 한다

중요한 이야기이다 

void function (int a)
{
    int b;
    int c[2];
}

우리가 컴파일러 라고 해도 이 function 함수는 stack에 16바이트
매개변수 a 가 4바이트  지역변수 b 가 4바이트 배열 c가 8바이트  총 16바이트가 스택공간에 할당된다
 
이것처럼 컴파일 동안에 메모리의 크기가 할당되어야 한다. 

그러니까 
void function(int i)
{
int array[i];
}
여기서 당연히 오류가 생기는 것이다

그래서 보통 다음과 같이 표현한다
"데이터 영역과 스택에 할당될 메모리의 크기는 컴파일 타임에 결정되어야 한다"

void function(void)
{ int i=10;
int array[i];
}
---> 이렇게 해도 에러가 생긴다
Posted by babuzzzy