2013-03-06 2 views
1

미안하지만 아주 간단한 질문 일뿐입니다. . C 프로그래밍 :포인터의 값을 확인하는 방법 (무효) 제로가 아님 (일반 포인터의 역 참조 시도)

구조체 이름은 rtg입니다. EDIT : MTCH의 타입은 초기의 OBJ의 종류가 typr (보이드)

포인터 LL_NODE이다 LLIST이다. 내가

(gdb) print *rtg->mtch->initial->obj 
Attempt to dereference a generic pointer. 


(gdb) print rtg->mtch->initial->obj 

$10 = (void *) 0x4cc660 
(gdb) x 0x4cc660 
0x4cc660:  0x00000000 

이 널 포인터 내 프로그램에서 segfault의 원인이 확인되면 gdb를 사용. 내가 찾고있는 것은 단순히 rtg-> mtch-> initial-> obj가 0이 아닌 것을 가리키는 값을 검사하는 방법이다. (위의 segfault를 방지하기 위해) 나는 if (rtg->mtch->initial->obj)으로 확인하면 포인터 obj가 0이 아닌지 확인합니다 (이것은 내가 의도 한 것이 아니며 그 포인터의 값을 0이 아닌 값으로 확인하려고합니다 (그러나 . 나는 말한다 GDB에서 확인하기 전에 * "일반적인 포인터 역 참조 시도" 그래서 (이 세그먼트 폴트를 방지) 그 값이 0이 될 수 없습니다 확인하는 올바른 방법은 무엇입니까 사용

편집 : 내가이

을 시도했다
if (*((char *) rtg->mtch->initial->obj) != NULL) 

하지만 난 경고 컴파일 가지고 :

을3210

경고 : 포인터와 정수

EDIT2의 비교,이 소스 코드에 정의 여기에 무엇을

ECM_REQUEST는 구조체 ECM_REQUEST RTG이다; 이 구조체의 은 LLIST mtch로 mtch를 정의합니다.

초기는

obj가 내가 확인하고 싶은 포인터 OBJ 값이 이제 모든 것을 내 질문에 대한 명확하지 않다 제로의

수없는 LL_NODE입니까?

감사합니다.

+8

구조체 선언과 같은 코드를 추가로 표시해야합니다. 그들에 대해 말하지 마라. – unwind

+0

'rtg'는 구조체가 아닙니다. 구조체에 대한 포인터에 대한 포인터 인 것 같습니다. 'obj'는 일단 여러분이 그것에 접근하게되면'void *'형처럼 보입니다. 즉, 그것을 참조하지 않는 것은 불법입니다. gdb는 'obj'가 가리키는 32 비트 객체가 전체 비트 0 표현을 가지고 있음을 알려줍니다. 소스 코드를 더 이상 보지 않고도 그 사실을 알 수 있습니다. –

+0

@Keith Thompson, 맞습니다. 구조체에 대한 포인터를 가리키는 포인터입니다. obj, 내가 무엇을 찾고, 그 포인터의 값을 0으로되지 않도록 segfault 내가'(rtg -> mtch -> 초기 -> obj! = NULL && * rtg로 확인하려고했는지 막기 위해) -> mtch-> initial-> obj = NULL)'그러나 이것은 올바르지 않습니다. 어떻게 수정합니까? –

답변

0

좌측이기 때문에 경고하는 간접 참조 char * (즉, char)과 우측이 void * 형태 널 포인터 상수이고; char 값을 void * 값으로 변환 중입니다 ... 아마 char **을 의미할까요?

void *o = rtg == NULL    ? NULL 
     : rtg->mtch == NULL   ? NULL 
     : rtg->mtch->initial == NULL ? NULL 
     : rtg->mtch->initial->obj; 

if (o != NULL) { /* ... */ } 

은 ... 오 다른 개체 포인터가의 유형을 변경하는 것이 안전해야한다는 메모를 수행 (예. 귀하의 질문은 char **을 제안하는 것?)

1

일반 포인터를 역 참조 할 수 없습니다. 유일한 해결책은 정수를 임시 포인터로 만들어 값을 확인하는 것입니다. 기본적으로

int *tmp = rtg->mtch->initial->obj; 
if (*tmp != 0) 
/* the rest of your code here */ 

캐스트는 작동하지만 임시 포인터를 가진 것은 내 의견으로는 코드를 읽기가 쉽게 할 수있다.