Тема: Вопросик по языку C
Привет!
В широко известной в узких кругах библиотеке sofia-sip наткнулся на такую процедуру:
static
nua_dialog_usage_t *nua_dialog_usage_for_session(nua_dialog_state_t const *ds)
{
if (ds == ((nua_handle_t *)NULL)->nh_ds)
return NULL;
return nua_dialog_usage_get(ds, nua_session_usage, NULL);
}
Когда начал вдумываться в оператор IF понял, что я чего -то не знаю об этом мире.
Можете объяснить в каком случае он не должен приводить к runtime error ?
Я написал минимальную прогу с такой конструкцией, она закономерно падает при запуске.
#include <stdio.h>
typedef int nua_dialog_state_t;
typedef struct nd {
nua_dialog_state_t * nh_ds;
} nua_handle_t;
void nua_dialog_usage_for_session(nua_dialog_state_t const *ds) {
if (ds == ((nua_handle_t *)NULL)->nh_ds)
printf("Yes\n"); else printf("No\n");
}
int main() {
nua_dialog_state_t const *ds;
nua_dialog_usage_for_session(ds);
}
Но может быть есть вариант, когда она не упадёт ?
Попробовал пройти отладчиком по софии:
Breakpoint 2, nua_dialog_usage_for_session (ds=0x20b0b038) at nua_session.c:321
321 if (ds == ((nua_handle_t *)NULL)->nh_ds)
Current language: auto; currently minimal
(gdb) print ds
$1 = (const nua_dialog_state_t *) 0x20b0b038
(gdb) print (nua_handle_t *)NULL
No symbol "NULL" in current context.
(gdb) print (nua_handle_t *)0
$2 = (struct nua_handle_s *) 0x0
(gdb) print ((nua_handle_t *)NULL)->nh_ds
No symbol "NULL" in current context.
(gdb) print ((nua_handle_t *)0)->nh_ds
$3 = 0x38
Вместо указателя получается смещение поля в структуре (???).
Но сравнивают -то его с указателем ?