2016-08-29 10 views
0

나는 C 프로그램을 썼다. 함수 내부 코드의 일부는 다음과 같다 :C에서 포인터를 가리키는 포인터를 초기화하고 선언 할 수없는 이유는 무엇입니까?

struct node* functionName(struct node *currentFirstPointer){ 
    struct node **head = NULL; 
    *head = currentFirstPointer; 
    return *head; 
} 
여기

node는 구조이다. 그러나 프로그램을 실행할 때이 줄은 segmentation fault이됩니다. 하지만 선언하고 아래의 같은 함수 안에 별도의 문에서 포인터 포인터를 초기화하면 잘 작동합니다.

첫 번째 블록이 작동하지 않고 두 번째 블록이 정상적으로 작동하는 이유는 무엇일까요?

+1

[___MCVE___] (http://stackoverflow.com/help/mcve)를 작성 하시겠습니까? –

+2

첫 번째 예제가 작동하고 두 번째 예제가 작동하지 않습니까? 왜냐하면 그건 의미가 없기 때문입니다. 다른 방향을 의미하지 않았 니? 첫 번째 예제에서 seg fault가 발생하면 문제는 게시 된 코드에 없습니다. – Lundin

+0

나는 당신의 경우에 정의되지 않은 동작을 이해하지만 Visual Studio에서 이것을 재현 할 수 없기 때문에 어느 컴파일러를 사용하고 있는지 말해 주실 수 있습니까? –

답변

2

포인터를 역 참조하는 두 가지 예가 있습니다.

struct node **head; 
*head = NULL; 
*head = currentFirstPointer; 

struct node **head = NULL; 
*head = currentFirstPointer; 

은 정의되지 않은 동작에 대한 원인입니다. 첫 번째에서는 NULL 포인터를 역 참조합니다. 두 번째에서는 초기화되지 않은 포인터를 역 참조합니다.

두 번째 블록은으로 작동 할 수도 있지만 정의되지 않은 동작에는 문제가 있습니다.

포인터를 역 참조하기 전에 먼저 head의 메모리를 할당해야합니다.

struct node **head = malloc(sizeof(*head)*SOME_COUNT); 
*head = currentFirstPointer; 
+1

OP는 두 번째 예제가 작동하고 첫 번째 예제가 작동하지 않는다고 주장합니다. – Lundin

+0

@ Lundin, 두 번째 블록조차도 정의되지 않은 동작의 원인이라고 말하고 있습니다. 작동하는 것처럼 보일 수도 있지만 정의되지 않은 동작입니다. –

+1

그렇다면 왜 첫 번째 오류가 발생했는지 설명하지 못합니다. 문제는 불분명하며 더 이상의 설명 없이는 대답 할 수 없습니다. – Lundin