2016-07-25 3 views
-5

는 다음 코드 한 : 나는 사용하여 함수C의 인수 값이 불변?

void func(uint8 *var) { 
    uint8 tempvar; 

    if (var) 
     var = &tempvar; 

    *var = 0; 
} 

를 호출 코드는 선에서 세그먼트 오류를 ​​제공

func(NULL); 

을 "* VAR = 0;" 왜냐하면 var는 여전히 메모리 주소 0x0을 가리 키기 때문입니다. 임시 변수에 대한 내 할당이 작동하지 않는 이유를 모르겠습니다!

+3

"임시 변수에 대한 내 할당이 작동하지 않는 이유". 글쎄, 그것은'var'가 원래 null 인 경우 명시 적으로 프로그램에 * 할당을 건너 뛰도록 요청했기 때문에 작동하지 않습니다. 귀하의 'if'조건은 정확히 말합니다. – AnT

+0

@ πάνταῥεῖ - 음, 범위 내의 로컬 변수이고 범위 내에서만 사용하고 있습니다. 매개 변수는 단일 포인터이고 주소의 변경은 호출자 변수를 수정하지 않습니다. 따라서 해당 범위 외부에서 액세스되는 변수는 없습니다. –

+0

이미 가지고 있습니다 ... –

답변

7

!을 생략했기 때문에. 당신은 변수가 존재하는지 여부를 테스트하고 있습니다,하지만 당신은 그것을 하지이 존재하는지 여부를 테스트해야합니다 if (!var) ...

이 조금 더 확장하려면 ... var 유형 uint8 *이며, 따라서 VAR 자체는 포인터입니다. if (var)을 쓰면 해당 포인터가 NULL이 아닌지 테스트합니다.

if (the var pointer already exists) 
    assign a new pointer to it (make it point to somewhere else) 

을하지만 (이 NULL을 가리키는 경우)이 존재하지 않는 경우, 당신은 혼자두고 : 의사 코드에서 코드를 말한다. 디버거 또는 간단한 print 문을 사용하여이를 확인할 수 있습니다. 따라서 널 포인터 (null-pointer)를 지정하면 프로그램이 중단됩니다.

+0

if (var == NULL)에 해당하는 if (var == 0)로 (var)가 변환되지 않습니까? –

+5

아니요. 'if (...)'는 무언가가 사실인지 아닌지를 테스트합니다. 0 (NULL) 값은 false로 승격됩니다. 다른 모든 값은 참입니다. 어쨌든, 그냥 해보십시오! –

+0

@ H.Guijt 이것이 (NULL)이 거짓 인 경우 이것이 확실한 이유는 아닙니다. –

관련 문제