'이중배열'에 해당되는 글 2건

  1. 2016.08.18 배열의 끝을 알리는 NULL의 사용
  2. 2016.05.31 [c 언어] 포인터의 크기 : 이중배열 사용시


보통 정해지지 않은 크기의 문자열을 저장할 때는 

1차원 메모리를 동적으로 할당 받아 사용합니다. 


이 메모리는 1차원 배열처럼 사용할 수 있지요.

다만, 할당받은 메모리의 위치를 벗어난 곳을 사용하면,

access 위반으로 프로그램이 동작하다가 강제 종료됩니다. (Run-time Error)

프로그래밍 하다보면 많이 발생되는 문제입니다. 

당연한 말이지만, 허가된 공간에서만 접근하고 사용해야합니다.


허가된 공간의 시작 주소는 string이며, 끝나는 지점(주소)은 string + STR_NUM입니다.

다만, 사용할 크기만큼 문자열을 넣어 사용하고 마지막 위치에 NULL을 넣어서

그 끝을 알릴 수 있습니다.


NULL 

 

 

다음처럼 5개의 공간을 할당 받더라도, 두개만 쓰고 3번째에 NULL을 넣어, 그 끝을 알릴 수 있습니다.





이젠

2차원 배열형태로 메모리 할당을 받은 경우를 설명하려 합니다


아래와 같이 1열엔 seoul, 2열엔 olympic, 3열엔 korea가 있고, 마지막열에 NULL로 그 끝을 알리려 합니다.

또한 각 행마다의 단어의 끝을 알리기 위해 seoul NULL, olympic NULL, korea NULL 로 저장합니다.


s

NULL 

 

 

 o

NULL 

 k

NULL 

 

 

 NULL

 

 

 

 

 

 

 


문자열의 경우 끝에 자동으로 NULL이 붙지만, 마지막 열은 일부로 NULL을 사용합니다. 


이 경우 print_strings함수에 단어의 갯수를 알려주지 않더라도, NULL이란 값이 보이면, 마지막 단어라는 점을 알릴 수 있습니다.

(물론 pring_stirng(char ** strs, int word_num) 이렇게 word_num을 직접 함수에 전달할 수 도 있지만요.)


print_strings함수에서는  NULL이 나오기 전까지 단어 출력을 반복합니다.( while(current[i]) )



다시 정리하면, 포인터의 사용시 마지막엔 NULL을 넣음으로...

허가 받지 않은 공간을 모르고 침범하는 오류를 피할 수 있습니다.


1차원 공간 뿐 만아니라 (문자열의 끝)

2차원 공간에서도, NULL을 사용할 수 있습니다. ( 마지막 단어)





Posted by 고무함지
,

포인터 사용시 주의해야할 것은 포인터 변수의 크기를 알아 내는 것입니다.

크기를 알아야 자료 복사나, 메모리 할당등을 할 수 있기 때문입니다.


여러가지 예제로 확인해보니, 주의할 점이 보이더군요.


1. 포인터 변수 자체의 크기인 경우


2. 포인터가 가르키는 것이 배열인 경우 그.. 배열의 크기가 됨.


3. 포인터가 가르키는 것이 배열인지, 행 하나인지 주의 할 것



아래 내용으로 어떤 차이들이 있는지 확인해보시기 바랍니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void main(void)
{
    int arr[3][4= { {1,2},{3,4,5},{6,7,8,9} };
    //0행 : 1, 2, 0, 0
    //1행 : 3, 4, 5, 0
    //2행 : 6, 7, 8, 9
    printf(" %d,", arr[2][1]);   
    // 배열 2행 1열의 값은 (0열 다음값인) -> 7
 
    printf(" %d,"*(*(arr+2)+1) );
    // 배열 2행 1열의 값은 역시 -> 7
 
    printf(" %d,"sizeof(arr));
    // arr은 전체 배열의 크기인 3x4x4byte = 48
 
    printf(" %d,"sizeof(arr+0));
    // 이건 arr과 동일한 결과가 나올 것으로 예상했으나, 명시적으로 0번째 행을 
    // 지칭 하기 위해서 + 0 을 하는 것임. 0번 행의 포인터이므로 .. 포인터의 크기는 4byte
 
    printf(" %d,"sizeof(arr+1));  // 역시 포인터의 크기 -> 4
    printf(" %d,"sizeof(arr+2));  // 포인터의 크기   -> 4
    printf(" %d,"sizeof(*(arr+2))); 
    // 포인터가 가르치는 곳(*연산자)이므로... 행의 크기 4x4byte = 16
 
    printf(" %d,"sizeof(*(arr + 2)+1));  
    // 포인터의 포인터가 가르키는 곳(**)이므로... 열의 하나의 크기 -> 4 byte
 
    printf("Good bye");
    // 결과  7, 7, 48, 4, 4, 4, 16, 4,
}
 
cs


Posted by 고무함지
,