2016-06-27 2 views
2
int main(void) 
{ 
    // create a node 
    node* list1 = malloc(sizeof(node)); 
    node* list2 = malloc(sizeof(node)); 
    list1 -> n = 2; 
    list2 -> n = 5; 
    list1 -> next = list2; 
    list2 -> next = NULL; 

    if(search(5, list1)) 
     printf("True\n"); 
    else 
     printf("False\n"); 

} 

위의 프로그램에서 노드 유형의 변수를 초기화 할 때 해당 변수에 메모리를 명시 적으로 할당해야했습니다. 그렇지 않으면 컴파일러에서 오류가 발생했습니다. 메모리 할당 오류

bool search(int n, node* list) 
{ 
    node* ptr = list; 
    while(ptr != NULL) 
    { 
     if(ptr -> n == n) 
     { 
      return true; 
     } 
     ptr = ptr->next; 
    } 
    return false; 
} 

그러나, 상기 함수 I 형 노드 "PTR"의 변수가 "검색"하지만 명시 적 메모리 할당없이 침입. 이 기능에 오류가없는 이유는 무엇입니까?

+6

'node * ptr = list;'부분을 놓치셨습니까? –

+0

포인터 변수를 사용하려고하기 전에 포인터 변수에 값을 할당해야합니다. 'main'에는 할당 된 노드가 없었기 때문에'malloc '으로 할당해야했습니다. 'search'에서 여러분은 그것들 중 하나를 인자로 전달하고 그것을'ptr'에 할당합니다. 그래서'ptr'은 처음에 전달 된 노드를 가리 킵니다. 나는 당신이이 코드를 복사하고 그것을 이해하려고 노력하고 있다고 생각합니까? –

답변

4

Q에 경고를 추가하는 것이 좋습니다. 그러나 "초기화되지 않은 변수"와 같은 것으로 가정합니다.

pm100의 설명에서 언급했듯이 프로그램이 실행될 때 런타임 오류가 발생할 수 있습니다. 그러나 같은 이유가 있습니다.

"초기화 됨"은 "할당 된 메모리 할당"을 의미하지는 않지만 값을 할당합니다. search()에서 당신은 바로 여기 제대로 이렇게 : BTW

node* list1; // No initialization 

가 : 당신이 다음에 NULL를 할당하고 경우 컴파일러는 감지 할 수있는 당신이 단독으로있는 경우

node* ptr = list; 

main()에서는이 작업을 수행하지 않습니다 이것을 ->으로 역 참조하십시오.

node* list1 = NULL; 
list1 -> n = 2; // Dereferencing NULL pointer constant 

그러나 컴파일러가 감지 여부

그에 따라 달라집니다 :이 같은 코드를한다면, 오류가있을 수 있습니다. 다시 말하지만, 런타임에서 두 경우 모두 오류가 발생합니다.

+0

내 추측은 '컴파일러 오류 발생'이 실제로 런타임 충돌이라는 것입니다. – pm100

+0

아, 가능합니다. –

3

나는 노드 "ptr"유형의 변수를 가지고 있지만, 메모리를 명시 적으로 할당하지 않아도 통과했다. 이 기능에 오류가없는 이유는 무엇입니까?

ptr은 유형이 node이 아닙니다. 코드에는 ptr이라는 변수가 있으며 포인터node으로 입력합니다.

다음 코드는 포인터의 공간을 만들었습니다.입니다.

node* ptr = list;