2016-12-03 1 views
2

의 내가if 문에서 변수에 값을 할당하면 else 문에서 다시해야합니까?

if ((p = malloc(int)) == null) { do something } 

else { do something else with p } 

내가 구문이 올바르지 않을 수 있습니다 알고이 코드를 가지고 있지만,이 할 수있는 경우 문은 사실이 아니다 null로 동일하지 우리가로 이동하는 경우, 내부 상태라고 가정 해 봅시다 else 문에서 p과 작업을 시도하면 은 여전히 ​​malloc(int)으로 지정됩니까? 또는 else 문에서 malloc(int)p에 다시 할당해야합니까? 조건을 검사하기 전에 평가 먼저 할당

p = malloc(sizeof(int)) 

에서 다음 올바르게 괄호를 사용할 경우

+1

"여전히 malloc이 할당됩니다"- malloc' * now * 결과에 할당되지 않습니다. * 메모리를 누출하지 않으려는 경우에만 구문이 잘못됩니다. 숙제는 괄호로 묶어야합니다. 'else' 블럭이'if' 테스트에서 실패를 야기하는 null이 아닌'p'를 가지도록 고쳐줍니다. – WhozCraig

+0

유효한 메모리를 가리킬지도 모르는 포인터를 사용하여 UB를 위험에 빠뜨리지 않고 간단한 할당으로 가설을 테스트 할 수 있습니다. 그리고 'else'블록에서 할당을 반복하지 않아도됩니다. – Beta

답변

2

논리는 다음과 같은

if ((p = malloc(sizeof(int))) == NULL) 
{ 
    // Here p is equal to NULL 
    // skip the else statement 
} else { 
    // Jump here if the allocation was successful and p is not equal to NULL 
} 

따라서이다.

+0

신속한 후속 질문이 있습니다. 내가 다음 구조체를 가지고 있다고하자. 구조체 { \t int A; \t int B; }; malloc을 사용하여 공간을 할당하기로 결정한 경우 int * p에 공간을 할당합니다. 할당 된 공간에 p-> A 또는 p-> B를 사용하여 매개 변수 A 및 B에 액세스 할 수있는 구조체가 포함되어 있습니까? 아니면 구조체를 저장하는 메모리 공간일까요? –

+0

@ JohnGringus 당신은 struct thing t와 같은 구조체의 객체를 정의 할 수 있습니다; t.A 및 t.B와 같은 데이터 멤버에 액세스 할 수 있습니다. 또는 struct thing * t = malloc (sizeof (struct thing))과 같이 동적으로 객체를 할당 할 수 있습니다. t-> A 및 t-> B와 같은 데이터 멤버에 액세스합니다. –

3

이 특정 예에서는 p이 생각하는대로 할당되지 않습니다. 항등 연산자 ==은 할당 연산자 =보다 우선 순위가 높습니다.

그래서이 : p는 부울 식의 결과가 할당됩니다 의미

(p = (malloc(int) == null)) 

:

(p = malloc(int) == null) 

은 동일합니다.

은 당신이 원하는 것은 :

((p = malloc(int)) == null) 

이것은 p-malloc의 결과를 할당 한 다음 NULL에 대하여 그 값을 비교합니다. 조건이 맞는지 아닌지에 관계없이 할당이 이미 완료되었습니다. 따라서 p에는 NULL 또는 동적으로 할당 된 메모리에 대한 포인터가 들어 있습니다.

관련 문제