c언어 static const, const static

int Sum(int ar[], int size) {

	static const int* par = ar;

	if (ar - par == size - 1)return *ar;
	else {
		return *ar + Sum(ar + 1, size);
	}
}

대충 위와 같은 코드를 작성하고 싶은데 이렇게 쓰면

표현식이 상수여야만 한다는 에러가 나서요…
(expression must have a constant value) 이 표현은 오른쪽 변수 즉,rvalue 가 상수가 되어야 한다고 이해해서 아래와같이

int Sum(const int ar[], int size) {

	static const int* par = ar;

	if (ar - par == size - 1)return *ar;
	else {
		return *ar + Sum(ar + 1, size);
	}
}

const 를 붙여줫지만 애러는 안고쳐졌습니다ㅠ

그렇다면 질문은 const static, static const 와 같은 표현이 c언어에 적용이 안되는 건가요? 사실 두 키워드를 검색해 봤는데, const 와 static 검색 결과가 따로따로 나오더라구요

만약 존재 한다면 위처럼 const satic, 이나 static const나 뭐든간에 정적 상수를 만들고 싶으면 어떻게 해야 하는지 궁금합니다!

안녕하세요 ㅎㅎㅎ

일단 정적이라는건 static 키워드인거잖아요?
컴파일시, 또는 실행되기전 값이 결정되야합니다.

무슨말이냐면, 함수의 매개변수 ar은 프로그램이 실행될때, 즉 누군가 함수 Sum을 호출할 때 결정되는 값이죠. 이건 정적이라고 할 수 없습니다.

그리고 저는 왜 ar과 par을 빼는지 잘 모르겠네요.

static 변수의 예제를 하나 첨부해드리겠습니다.

void increaseNumber()
{
    static int num1 = 0;     // 정적 변수 선언 및 값 초기화

    printf("%d\n", num1);    // 정적 변수 num1의 값을 출력

    num1++;    // 정적 변수 num1의 값을 1 증가시킴
}

int main()
{
    increaseNumber();    // 0
    increaseNumber();    // 1
    increaseNumber();    // 2
    increaseNumber();    // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함

    return 0;
}

출처
https://dojang.io/mod/page/view.php?id=690

1 Like
int Sum( int ar[], int size )
{
	if( size < 2 )
	    return  *ar;
    return  *ar + Sum( ar + 1, size - 1 );
}

일단 이렇게 하면 동작되겠죠.

static 과 const 의 의미를 아직 이해 못하신듯.

static 은 프로그램이 처음 실행될때 초기화 되는 메모리 영역을 말합니다.
그러니 함수의 호출과 무관하게 한 곳에 예약되어 있는 변수를 선언한게 되죠.

함수 내부에 선언된 static 은, 접근을 함수내부에서의 접근만으로 제한하지만,
수명은 global cycle 을 따른다는 것 ( 프로그램 첨 실행시 메모리 할당, 종료시 제거 )
값의 초기화는 처음 호출된 한 번만 행하게 됩니다.

위의 코드대로 하면 처음 전달한 배열 외엔 오작동하는 녀석이 되겠죠.

const 는 생성과 동시에 초기화 된 후 값이 변화되지 않음을 말합니다.

즉, static const 라고 하면, 인자로 주어지는 다양한값을 대입할 수 없음을 말합니다.

반대로 그냥 const 라고 하고 함수 내에서 초기화를 해주게 되면 함수 실행시 매번 초기화를 행합니다.
( overhead 가 생기죠 )

int Sum( int ar[], int size )
{
	static int* par = ar;

	if( ar - par == size - 1 )
	    return *ar;
	else
		return *ar + Sum( ar + 1, size );
}

#define countof( a ) ( sizeof a / sizeof a[ 0 ] )

int main()
{
	int test[]{ 1, 2, 3, 4 };
	int test2[]{ 1, 2, 3, 4 };
	
    printf( "%d\n", Sum( test, countof( test ) ) );
    printf( "%d\n", Sum( test2, countof( test2 ) ) );

    return  0;
}

예를들어 이렇게 실행하면
함수 내부의 static 으로 처음 전달한 test 만 초기화 되어
10과 20 처럼 엉뚱한 값이 출력되게 됩니다.
( 컴파일러마다 스택 생성 순서 규칙에 따라 조금 다를 수 있습니다 )

두번째 전달한 test2 로 초기화되지 않아서, test1 부터 test2 까지 다 더해버렸기 때문입니다.

함수 내부에 선언된 static 변수의 초기화는 one time initialize 라는걸 생각하시면 됩니다.

static const 로 초기화하는 경우는

static const double sin_table[]{ ... };

처럼 그냥 고정해 놓고 함수 내에서만 사용할 상수를 선언하는 용도로 쓰는 것이지
변수를 받아 초기화하기 위함이 아니라는 말씀이죠.

정말 세세한 답변 감사드립니다! 그동안 static 정적 변수를 써왔지만 제대로 공부하지않았음을 느끼네요…
항상 공부하다 모르는게 생기면 구글링부터 해왔었는데, 오늘은 왠지 바로 질문을 올리게되어서 사실 구글링으로도 알 수 있는 내용들인데도 세세하게 답변을 달아 주셔서 부끄럽네요ㅠㅠ 다시한번 감사드립니다! 오늘 확실히 static 개념을 잡게 된 것 같습니다!

1 Like