본문 바로가기

공부/컴퓨터

배열의 동적 할당사용시 주의점.

반응형
데브랜드의 라이님께서 작성하신 자료를 보고 직접 실험해본 소스이다.

이 소스의 문제는 동적 메모리 할당에 관련된 문제이다.

테스트한 소스는 아래와 같다.




01: #include <stdio.h>
02:
03: void makeCharArray(int);
04:
05: void main(void) {
06:
07:         int  i=0;
08:
09:         printf("Input char Array size : ");
10:         scanf("%d",&i);
11:
12:         makeCharArray(i);
13:
14: }
15:
16:
17: void makeCharArray(int i) {
18:         char temp[i]="";
19: }





저기서 문제는 바로 makeCharArray 함수에서 인수로 받은 i 만큼 char 배열을 생성 할려고 하는데서 문제가 생긴다.

다음과 같은 에러가 나게 된다.


--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
test.cpp
C:\Documents and Settings\ggaman.com\My Documents\프로그램 프로젝트\Test\test.cpp(19) : error C2057: expected constant expression
C:\Documents and Settings\ggaman.com\My Documents\프로그램 프로젝트\Test\test.cpp(19) : error C2466: cannot allocate an array of constant size 0
Error executing cl.exe.

Test.exe - 2 error(s), 0 warning(s)




이로써 알수 있는것은 배열의 인수는 컴파일 타임에 결정 되어야 한다는 것이다.
( 여기서는 인수로 어떠한 수가 넘어올지 알 수 없으므로 런타임에 결정된다고 볼수 있다. )


그렇다면 런타임에서 배열을 잡기 위해서는 어떠한 방법이 필요할까.
일반적으로 메모리 동적할당에 사용하면 malloc 를 사용하면 된다.

아래의 makeCharArray(int i) 함수를 다음과 같이 바꾸면 된다.
( 너무 일반적인 메모리 동적 할당이다. )


02: #include <stdlib.h>
// 중간 생략.
18: void makeCharArray(int i) {
19:         char *temp = NULL;
20:
21:         temp = (char*)malloc(sizeof(char)*i);
22:
23:         free(temp);
24:        
25: }






여기서 꼭 알아야 할것은 메모리 동적할당에 malloc를 사용해야 한다는것 보다는

일반적인 배열을 잡을때 배열의 사이즈는 컴파일 타임에 결정 되게 되므로
동적할당이 되게 배열을 잡을수 없다는 것이다.

정확한 이유는 자세히 생각해 보아야 할것 같다.


아래는 데브랜드에 라이님께서 작성한 글이다.
이런 내용의 글을 처음 보는 사람이라면 꼭 한번 읽어보아야 할 글이다.

http://devland.net/src/s_bbs/?menu=view&idx=73&page=1&ref=59&step=&total_record=74&table=study_d2&keyfield=&key_text=&number=72
반응형