미안하지만 아주 간단한 질문 일뿐입니다. . 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입니까?
감사합니다.
구조체 선언과 같은 코드를 추가로 표시해야합니다. 그들에 대해 말하지 마라. – unwind
'rtg'는 구조체가 아닙니다. 구조체에 대한 포인터에 대한 포인터 인 것 같습니다. 'obj'는 일단 여러분이 그것에 접근하게되면'void *'형처럼 보입니다. 즉, 그것을 참조하지 않는 것은 불법입니다. gdb는 'obj'가 가리키는 32 비트 객체가 전체 비트 0 표현을 가지고 있음을 알려줍니다. 소스 코드를 더 이상 보지 않고도 그 사실을 알 수 있습니다. –
@Keith Thompson, 맞습니다. 구조체에 대한 포인터를 가리키는 포인터입니다. obj, 내가 무엇을 찾고, 그 포인터의 값을 0으로되지 않도록 segfault 내가'(rtg -> mtch -> 초기 -> obj! = NULL && * rtg로 확인하려고했는지 막기 위해) -> mtch-> initial-> obj = NULL)'그러나 이것은 올바르지 않습니다. 어떻게 수정합니까? –