프로젝트 명 : Stack_Linked List


< 프로젝트 설명 >


이 프로젝트는 스택과 Linked List를 같이 써서 구현한 프로젝트입니다.

이 프로젝트를 통해 스택과 Linked List가 어떻게 돌아가는 지 볼 수 있습니다.


< 소스코드 >


#include <stdio.h>


#include <stdlib.h>




typedef struct NODE


{

    

    int data;

    

}NODE;




NODE* node;


int length=0;


int range=0;




void RANGE(void);


void push(int n);


void pop(void);


void PRINT(void);




int main(void)


{

    

    int i;

    

    RANGE();

    

    for(i=0;i<20;i++)

        

    {

        

        push(i);

        

    }

    

    PRINT();

    

    for(i=0;i<=20;i++)

        

    {

        

        pop();

        

    }

    

    PRINT();

    

    

    

}




void push(int n)


{

    

    if(range<=length)

        

    {

        

        printf("OVER FLOW\n");

        

    }

    

    

    

    else

        

    {

        

        length++;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

        node[length-1].data=n;

        

    }

    

}




void pop()


{

    

    if(length!=0)

        

    {

        

        length--;

        

        node=(NODE*)realloc(node,sizeof(NODE)*length);

        

    }

    

    else

        

        printf("EMPTY\n");

    

}




void PRINT (void)


{

    

    int i;

    

    for(i=0;i<length;i++)

        

        printf("%d 번째 출력 : %d\n",i+1,node[i]);

    

    printf("\n");

    

}




void RANGE(void)


{

    

    printf("STACK 크기는 몇으로 지정하시겠습니까? : ");

    

    scanf("%d",&range);

    

 

}

'Programming > C' 카테고리의 다른 글

함수 포인터  (0) 2015.08.27
[ Project ] Wild!  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26

연결 리스트란 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식이다.



Ⅰ. 연결 리스트의 구성 



연결 리스트는 노드로 이루어져 있다. 노드란 자료 하나를 담고있는 것을 말한다.


노드는 자기 자신의 값과 다음 노드를 가리키는 노드 포인터로 구성된다.

( 처음 부분의 노드를 Head 마지막 부분의 노드를 Tail 이라고 한다 )


아래 그림들의 연보라 색과 하늘색과 같이 각 노드는 값을 가지고 그 옆에 다음 노드로 가는 주소값을 가져 서로 연결되게 된다.( 연보라 부분이 값을 담는 부분, 하늘색 부분이 다음 노드로 넘어가는 주소 부분이다)


노드를 연결한 방법에 따라 단순 연결 리스트, 이중 연결 리스트, 원형 연결 리스트로 구분된다.



  ① 단순 연결 리스트



위의 그림과 같이 각 노드에 자료 공간과 한 개의 포인터 공간이 있고, 각 노드의 포인터는 다음 노드를 가리킨다.




② 이중 연결 리스트



위의 그림과 같이 단순 연결 리스트와 비슷하지만, 포인터 공간이  앞과 뒷 부분에 2개가 있어 

각각의 포인터는 앞의 노드와 뒤의 노드를 가리킨다.


③ 원형 연결 리스트 



위의 그림과 같이 일반적인 연결 리스트에 마지막 노드와 처음 노드를 연결시켜 원형으로 만든 구조 이다.




Ⅱ. 링크드 리스트 구현 


#include <stdio.h>

#include <stdlib.h>


typedef struct member

{

    char name[20];

    int age;

    struct node *NEXT;

}MEM;


int main(void)

{

    int nop=0,i;

    printf("사람은  명입니까? : ");

    scanf("%d",&nop);

    MEM* name=(MEM*)malloc(sizeof(MEM));

    MEM* age=(MEM*)malloc(sizeof(MEM));

    

    for(i=0;i<nop;i++)

    {

        printf("%d번째 사람의 이름은? : ",i+1);

        scanf("%s",name[i].name);

        printf("%d번째 사람의 나이는? : ",i+1);

        scanf("%d",&age->age);

        printf("\n\n\n이름 : %s\n나이: %d\n\n\n",name[i].name,age->age);

    }

 

}

'Programming > C' 카테고리의 다른 글

[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
구조체 ( Struct ) Programming/C 2015. 8. 27. 10:10

구조체란 서로 관련있는 하나 이상의 변수들을 묶어 사용하는 것을 말합니다.

예를 들면 변수 중에 신원 정보를 파악할 수 있도록 이름, 나이, 성별등을 입력하는 변수들을 하나로

묶어 사용하는 것을 말합니다.

 


Ⅰ.  구조체 정의


 구조체를 정의 할때의 형식은 아래와 같은 형식으로 정의합니다.


struct identity{

    int age;

    char name[20];

    char gender[6];

};


identity란 구조체 명을 의미하고 안에 있는 변수들은 identity라는 구조체에 포함된 변수들입니다.

 



Ⅱ. 구조체의 선언



구조체를 선언하는 방식에는 여러가지의 방법들이 있습니다. 



struct identity{

    int age;

    char name[20];

    char gender[6];

} iden;




struct identity{

    int age;

    char name[20];

    char gender[6];

};

    struct identity iden;




struct identity{

    int age;

    char name[20];

    char gender[6];

};

typedef struct identity IDEN;

IDEN iden;




typedef struct identity{

    int age;

    char name[20];

    char gender[6];

}IDEN;

IDEN iden;



위와 같이 여러가지의 선언 방법이 있습니다.

③번과 ④번에 나온 typedef라는 것은 구조체 뿐만 아니라 다른 곳에서도 유용하게 널리쓰입니다.

 

typedef의 기능은 변수를 선언할 때 자료형의 이름을 사용자의 임의대로 바꿔줄 수 있습니다.

예를 들어 unsigned int * 와 같이 긴 자료형을 일일이 칠려면 귀찮기도 하고 불편합니다.

이때 typedef unsigned int* P_UNIT; 를 입력하여 unsigned int*을 P_UNIT로 

바꿔줄 수 있습니다. 


위와 같이 typedef를 사용하실 때에는 typedef (변경할 자료형)(변경후 자료형)형식으로 사용 합니다.





Ⅲ. 구조체 사용 


구조체를 사용할 때는 아래와 같이 사용 합니다.


#include <stdio.h>


struct identity{ // 구조체의 

    int age;

    char name[20];

    char gender[6];

} iden; // 구조체의 식별자


int main (void){

struct identity iden; // 구조체 변수의 선언

    printf("Name? : "); scanf("%s",iden.name); 

// 구조체를 사용할 때는 구조체 .변수  으로 사용

    printf("Age? : "); scanf("%d",&iden.age);

    printf("Gender? : "); scanf("%s",iden.gender);


 

}


의 주석에서의 설명과 같이 다른 함수내에서 사용하기 위해 구조체를 선언 해줍니다.

main 함수에서 iden.name 같은 형식은 구조체를 사용하기 위한 형식으로 (구조체 명.변수명)으로 

사용합니다.


★ 구조체를 사용하여 함수의 인자로 전달과 반환 대입연산은 가능하지만 사칙연산은 안됩니다. 




'Programming > C' 카테고리의 다른 글

[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
Stack과 Queue Programming/C 2015. 8. 26. 23:41

Ⅰ. Stack


Stack 은 LIFO ( Last In First Out ) 으로 늦게 들어온 게 먼저 나오는 형태입니다. 

(Ex) 1, 2, 3 순으로 들어가면 3, 2, 1 순으로 나온다.


< 코드 설명 >

1. Stack 에서 데이터를 넣는 것을 푸시 ( Push ) , 빼내는 것을 팝 ( Pop ) 이라고 합니다. 

2. Top 이라는 위치에서 데이터의 입력과 출력이 일어납니다.


< Stack 예제 >




< 실행 결과 >





Ⅱ. Queue


Queue FIFO ( First In First Out )  으로 먼저 들어온 게 먼저 나오는 형태입니다.

(Ex) 1, 2, 3 순으로 들어가면 1, 2, 3 순으로 나온다.


Stack는 입력을 받는 곳에서 출력이 되지만 Queue 입력을 받는 곳과 출력을 하는 곳이 다르기 때문에 

Rear에서 입력이,  Front에서 출력이 됩니다.


< Queue 예제 > 



전에 만들어 놓은 코드의 Push() 함수 부분에 큰 오류가있어서 다시 만들었습니다..


< 출력 결과 >




구분하기 쉽게 " . " 으로 구분할 수 있게 하였습니다.


'Programming > C' 카테고리의 다른 글

연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26

Ⅰ. Call-by-value

 

- 함수를 호출 할 때 단순히 값을 전달하는 형태의 함수호출


< 예제 >


#include <stdio.h>

void change(int n1, int n2){

    int temp= n1;

    n1=n2;

    n2=temp;

    printf("(After) Number 1 : %d, Number 2 : %d \n",n1,n2);

}

int main(void){

    int num1=10;

    int num2=20;

    printf("(Before) Number 1 : %d, Number 2 : %d \n",num1,num2);

    change(num1,num2);

    //printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    -> 사용시 num1과 num2가 바뀌지 않는다 (위에 함수를 int형으로 바꾼뒤 return n1,n2;)

    return 0;

 

}


< 출력결과 >


(Before) Number 1 : 10, Number 2 : 20 

 

(After) Number 1 : 20, Number 2 : 10



 

Ⅱ.Call-by-reference 


- 모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수 호출 


< 예문 > 


#include <stdio.h>

void change(int *ptr1, int *ptr2){

    int temp = *ptr1;;

    *ptr1 = *ptr2;

    *ptr2 = temp;

}

int main(void){

    int num1=10;

    int num2=20;

    printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    change(&num1,&num2);

    printf("Number 1 : %d, Number 2 : %d \n",num1,num2);

    return 0;

 

}


< 출력 결과 >


Number 1 : 10, Number 2 : 20 

 

Number 1 : 20, Number 2 : 10 






sourced by "윤성우 열혈 C 프로그래밍 강의" 



'Programming > C' 카테고리의 다른 글

구조체 ( Struct )  (0) 2015.08.27
Stack과 Queue  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
2차원 배열 Programming/C 2015. 8. 26. 22:51

2차원 배열 

- 2차원 배열은 1차원 배열과는 다르게 첨자 2 개를 사용하는 배열이다. 같은 데이터형의 변수가 

  행( row )과 열( column )을 나타내는 데 , 첫 번째 첨자는 행을, 두 번째 첨자는 열을 나타낸다.




 Ⅰ. 행과 열

    

 1차원 배열에서는 변수이름 [ 열 ]로 표현했지만 , 2차원 배열에선 변수 이름 [행] [열] 로 표현한다. 옆에 그림과 같이 표현한다.       



Ⅱ.  2차원 배열의 크기


변수이름 [i:n][j:m] 의 크기는 i와 j 가 첫 번째 요소의 행과 열의 첨자이고, n과 m은 마지막 요소의 행과 열의 첨자이다. 

따라서, 배열의 크기를 구하는 공식은 ( n-i+1) x ( m-j+1) 이다.

 

 (ex) 위의 그림 처럼 첫 번째 요소의 행과 열은 [0][0]이므로 i 와 j 는 0이고, 마지막 요소의 행과 열은 [2][1]이므로 n은 2, 

        m은 1이다. 따라서 위의 그림의 배열의 크기는 (2-0+1) x (1-0+1) 으므로 3x2는 6이되어, 

        위 그림의 2차원 배열의 크기는 6이다.



Ⅲ. 2차원 배열의 저장 방식 


2배원 배열에는 행 중심 저장 방식과 열 중심 저장 방식이 있다. 행 중심 저장 방식은 1번째 행,

2번째 행 .. 순으로 저장하고 열 중심 저장 방식은 마찬가지로 1번째 열, 2번째 열.. 식으로 저장 한다.


[그림 7-7] 2차원 배열 요소의 주소

 

☞ 2차원 배열 arr[n][m]에서 첫 번째 요소의 행과 열의 첨자가 a이고 시작주소가 base, 요소의 크기가 size라고 할 때 ,

    arr[i][j]의 주소를 구하는 공식은 다음 과 같다


① 행 중심 저장 방식 

   arr[i][j] 의 주소 = base + (m x (j-a)) x size


② 열 중심 저장 방식 

   arr[i][j] 의 주소 = base + (n x (j-a)) x size


(ex) 위의 사진을 예로 들면 시작 주소는 200이고 각 요소의 크기는 4이니.. ▼


① 행 중심 저장 방식의 arr[2][0]

   200 + (2 x (2-0) + (0-0)) x 4 = 216


② 열 중심 저장 방식의 arr[2][0]

   200 + (3 x (0-0) + (2-0)) x 4 = 208


두 결과 모두 원하는 결과를 출력하고 있다.




                                                                                   sourced by "NAVER"

'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
동적 할당  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14
동적 할당 Programming/C 2015. 8. 26. 12:51
동적 할당

- 컴파일을 실행하기 전에 메모리의 크기가 정해져 할당되어 있는 정적 할당과 달리 프로그램 실행 중에 
  메모리의 크기를  임의로 정할 수 있는 할당을 동적 할당이라 한다.
 
   ☞ 동적 할당을 쓰는 이유는 정적 함수를 쓸데보다 좀 더 효율 적으로 메모리를 활용 하기 위해서이다.

Ex) 1 ~ 100을 입력하는 배열에서는 크기를 100으로 줘야 하는데 그럼 20을 입력하면 80이 쓸데없게 된다. 
    이러한 메모리를 효율적으로 사용하기 위해 동적 할당을 사용한다.


I. 동적 할당에서 사용하는 함수
 
※아래의 함수를 사용하기 위해선 헤더파일에 #include <stdlib>를 선언해 주어야 한다. ( standard library의 약자 )

1. malloc 함수

- Memory Allocation의 약어로 "메모리 할당" 이라는 뜻이다. 메모리의 크기를 설정 하기 위해 사용 한다.

형식 : 포인터 변수명 = (자료형 *) malloc ( sizeof( 자료형 ))

2. calloc 함수 

- Clear Allocation의 약어로 "깔끔한 할당" 이라는 뜻이다. 메모리의 크기를 초기화 한 뒤 메모리의 
  크기를 설정 할 수 있다.

형식 : 포인터 변수명 = (자료형 *) calloc ( 메모리에 곱할 수, sizeof( 자료형 ))
 
Ex) num = (int *) calloc (5, sizeof(int))의 메모리의 크기는 5x(int의 자료형의 크기 4) 이니 20 이다.

3. realloc 함수

- Re Allocation의 약자로 "재할당"이라는 뜻이다. 동적 메모리 할당을 해제하지 않고 다시 설정하여 
  이어서 사용이 가능하다.

형식 : 포인터 변수명 = (자료형 *) realloc  ( 재설정할 변수 명 , sizeof( 자료형 ))


II. 동적 할당을 끝낼 땐..

- 동적 할당을 끝내고 싶을 땐 free (포인터 변수)를 입력하면 된다.



'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14
[ Project ] Pascal Programming/C 2015. 8. 26. 10:29

프로젝트 : Pascal 



프로젝트 설명 :


- 1             <- 왼쪽과 같이 위에 두 수를 더해 아래에 출력하는 프로그램이다.

  1 1           

  1 2 1         

  1 3 3 1       



소스코드 :


#include <stdio.h>

int main(void){

    int arr[10][10]={0,};// 2차원 배열은 통해 판을 만들고 0으로 초기화 하였다.

    int  i , j, num=1; // i = 행 , j = 열

    for(i = 0 ; i < 10 ; i ++ ){

        for(j = 0 ; j < num ; j ++ ){

            if( j == 1 ){ // 모든 줄의 첫번째 행에는 1을 넣는다.

                arr[j][i]=1;

            }

            else if( i == 2 ){ // 2번째 줄의 모든 열에는 1을 넣는다.

                arr[j][i]=1;

            }

            if(j>1&&i>2){ //위의 경우를 둘다 만족하지 않을 경우.

                arr[j][i]=arr[j-1][i-1]+arr[j][i-1];

            }

        }

        num++;

    }

    for( i = 0 ; i < 5 ; i ++ ){ // 출력을 위한 for 문

        for( j = 1 ; j < i+1 ; j ++ ){

            printf("%d ",arr[j][i]);

        }

        printf("\n");

    }

 

}

'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14

프로젝트 : 


File_Editor


만들게 된 동기 : 


얼마 전부터 Python을 배우고 있었고, 동아리에서 스크립트 언어로 간단한 프로젝트를 만들어 오라고 하셨다. 

처음엔 스크립트 언어가 뭔지 몰라서 스크립트 언어에 대해 찾아봤는데, 스크립트 언어는 Python 이나 Perl, PHP과 

같이 소스코드를 컴파일 하지 않고도 응용프로그램을 실행할 수 프로그래밍 언어를 말한다고 한다. 

예를 들면 Python 이 컴파일 하지 않고도 인터프리터에 의해 실행되는 것 처럼 말이다.


프로젝트 설명 : 


이 프로젝트는 선택창에서 파일을 입력할 건지, 읽을 것인지, 종료할 건지 선택하게 하여 이에 맞는 명령을 실행하는 프로그램이다.


소스 코드 :



소스 코드 설명 : 


이 코드는 매우 간단한 구조를 띄고 있다.

그냥 처음에 List 를 띄어준 뒤, 4 가지의 선택 중 하나를 선택한다.

그 선택에 맞춰 명령을 실행하는 코드 이다.

( 코드를 짠 시간 보다, 외관 상 보기 좋게(?) 만드는 게 더 오래 걸린것 같다..)


실행 결과 : ( 복사하려다가 아무래도 사진이 더 좋은 것 같아서 ... )







만들면서 :


처음에 만들땐 "TextMate"라는 앱을 사용하였는데, 이 앱이 입력을 못 받는 것 같아서 Terminal 로 실행을 한 번 해보았다.



그러나 이상한 에러가 나오는 데 경로가 잘못됬다는 것을 알게 되어, 파일이 있는 디렉토리로 가 실행을 하였다.



포인터메모리의 주소 값을 담고 있는 변수 ( 또는 상수 ) 입니다.


⚀ 변수의 선언과 메모리의 할당


먼저, 위의 그림과 같이 변수가 선언되었다고 생각해봅시다.

char형은 1byte, int형은 4byte이니 총 6byte가 메모리 공간에 할당되게 됩니다.


위의 그림의 메모리 블록 위에 0x12ff73 과 같은 값들은 메모리 블록의 주소 값을 말합니다.

주소 값은 1byte의 메모리 블록 단위로 할당됩니다.


그럼 위의 그림을 보고 'A'는 0x12ff74에, 'Q'는 0x12ff75에 할당되어있습니다.

그렇다면 int형 변수 num에 담겨있는 7은 0x12ff76 ~ 0x12ff79번지에 할당되었다고 볼 수 있을까요?

답은 '아니오' 입니다. 이유는 C언어에서의 포인터는 시작 번지만으로 위치를 표현하기 때문입니다.

int형은 4byte이므로 시작 주소만 알면 끝 주소는 쉽게 알수 있겠죠?


그렇다면 여러분 int 형 변수 num은 어디에 저장되어 있을까요?

네, 0x12ff76번지에 저장되어 있습니다.

그런데 주소값 0x12ff76 또한 정수이기 때문에 저장이 가능합니다.

그리고 이와 같이 주소값을 저장하기 위해 사용하는 변수가 바로 '포인터 변수' 입니다.



⚁ 포인터 변수를 선언하는 방법


"정수 7이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언한 뒤 pnum에 num의 주소값을 저장하자"

위의 문장대로 실행하려면 어떻게 해야 할까요? 다음과 같은 코드로 작성하면 됩니다.



위의 코드에서 여러분은 *와 &라는 연산자를 볼 수 있을겁니다.

*와 & 연산자는 어떤 작업을 할까요?

우선 * 연산자는 "변수를 가리키는 연산자"입니다.

좀, 설명이 어려울 수 있겠지만 위와 같이 int * pnum이라고 한다면 int 형 변수를 가리키는 pnum의 선언을 의미합니다.

음.. int 형 변수의 주소 값을 저장할 수 있는 포인터 변수 ( pnum )의 선언이라고 하면 될것 같네요.

다음으로 & 연산자는 "오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자" 입니다.

& 연산자는 * 연산자에 비해 이해하기 쉬울것이라고 생각됩니다.

위의 코드와 같이 pnum= &num이라는 코드는 주소 값을 저장할 수 있는 포인터 변수 pnum에 num에 주소 값을 넣어준다고 생각하시면 됩니다.


따라서 위의 코드를 해석해 보자면 num에 7이라는 값을 넣어준 뒤 num의 주소 값을 저장할 포인터 변수 pnum을 선언해 줍니다.

그 뒤, pnum에 num의 주소 값을 넣어주는 것 입니다.

이해 가셨죠?


아! 그리고 포인터 변수를 선언할 때에는 포인터 변수가 가리키고자 하는 변수의 자료형과 포인터 변수의 자료형이 같아야 합니다.

예를 들어, type num이라는 변수의 주소 값을 저장하고 싶을 때에는 type * ptr이라는 포인터 변수를 선언해 주어야 합니다.

이런 식으로 주소 값을 저장할 변수와 포인터 변수의 자료형이 일치해야 하는 이유는 자료형이 달라지면 크기도 달라지기 때문입니다.

예를 들어 int 형 변수는 4byte인데, 1byte인 char형 포인터 변수에 저장을 하면 오류가 생기겠죠?



⚂  Example Question




① 포인터 변수 pnum을 선언합니다.

② pnum에 num 1의 주소 값을 저장합니다.

③ pnum은 num 1이므로 30을 증가시킵니다.

④ pnum이 가리키는 대상을 num2로 변경합니다.

⑤ pnum은 num2 이므로 30을 감소시킵니다.


실행 결과 : num1 : 130, num2 : 70


위의 실행결과를 통해서  pnum에 num이 담겨있었다는 것을 확인할 수 있을 것입니다.



⚠︎ 잘못된 포인터의 사용과 NULL 포인터


▾ 1번 





<실행 결과>

The variable 'ptr' is being used without being initialized.

- ptr 이 초기화 되지 않았다고 나옵니다.






포인터 변수를 선언만 하고 초기화 하지 않으면, 포인터 변수는 쓰레기 값으로 초기화됩니다.

즉, 어디를 가리킬지 모르게 됩니다. 

이러한 경우 매우 치명적인 결과로 이어 질 수 있습니다.

다행히 요즘의 운영 체제는 잘못된 메모리 접근의 시도가 있을 때, 이를 감지하고 해당프로그램을 중지시켜서 잘못된 메모리의 접근을 방지합니다.

▶︎ 위에 경고창이 그런 경우인것 같습니다.



▾ 2번 






1번의 경우와 같지만 125로 초기화 하였습니다. 

하지만 125가 메모리 내에서 어디인지를 모르니 이는 결국 쓰레기 값으로 출력 한 것과 같게 됩니다.


▶︎ 그렇다면 올바른 포인터 변수의 초기 값은 무엇인가?


올바른 포인터 변수의 초기 값에는 '0'이나 'NULL'을 써야 합니다.

초기화 하는 값이 0인걸 가리켜 '널 포인터 (NULL Pointer)'라고 합니다.

이는 0을 가리키는게 아닌 '아무데도 가리키지 않는다' 라는 걸 의미합니다.

'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26
[ Project ] Pascal  (0) 2015.08.26