2011-01-20 14 views
6

Estoy trabajando en un proyecto y sigo encontrando este error que no me permitirá completar el proyecto. Cuando inicializo uno de mis punteros para señalar un objeto que se creará durante la ejecución del programa y lo inicializo en NULL. Luego, cuando verifico para qué se establece, devuelve un valor de nil. ¿Cómo es posible? No creía que existan indicadores nulos en C. ¿Hay alguna forma de evitar esto?(nil) puntero en C/C++

struct order_line *front = NULL; 
... 
printf("Head: %p\n", front); // prints -> Head: (nil) 
+1

¿Cómo se comprueba el valor de su puntero? Debugguer? Printf? Esto puede ser solo un problema de representar el puntero NULL con su herramienta. –

+3

¿Qué significa "nil" aquí? 0? ¿C objetivo? –

+0

Estoy usando printf (% p) para verificarlo y está en C normal, no en el objetivo – CF711

Respuesta

9

%p en printf formatea un tipo de puntero. Esto va a distinguir un puntero nulo e imprimir (nil) porque es un valor especial en el contexto de un puntero. Si desea dar salida a 0 para un puntero nulo, emitir el puntero a un entero y usar %d lugar:

printf("Head: %d\n", (int) front); 

Respuesta original, ya que todavía puede ser útil:

NULL es una macro definida como 0 o ((void *) 0), por lo que si establece un puntero a NULL es exactamente lo mismo que establecerlo en 0. Esto funciona con el propósito de declarar punteros nulos porque la memoria en la dirección 0 nunca se asignará a su programa.

+0

No, en realidad me estoy poniendo nulo como el error. – CF711

+0

@Chris ¿Qué te da nada? ¿Podemos ver algún código? – marcog

+2

'nil' no existe en C a menos que lo haya definido. –

0

Supongo que nada es lo que su depurador le está diciendo. En la mayoría de los compiladores, null simplemente se define # a 0 de todos modos, por lo que ese nombre no es tan importante.

+0

Estoy ejecutando un cheque dentro de él para comprobar si es NULO, pero cuando compruebo a qué apunta, me sale (nulo). – CF711

+5

typedef a 0? Eso no es ningún tipo de cosas que haya escuchado. : p –

+0

sí #define es lo que quise decir – rerun

0

Como otros han dicho, no hay tal cosa como puntero nulo en C.

puede ser su asignación de memoria falla, causando 0 que se asignará al puntero.

3

Al imprimir usando un puntero printf("%p", somePtr), se imprime en una forma definida por la implementación, de acuerdo con esta cita del POSIX printf specification (redacción similar existe en la especificación C99 también).

El argumento debe ser un puntero a void. El valor del puntero se convierte en una secuencia de caracteres imprimibles, de una manera dependiente de la implementación.

supongo, esto significa que si el puntero está NULL, puede imprimirlo sin embargo, quiere, incluyendo la impresión como nil o 0x00000000 o 0.

+0

bueno, yo solo termino obteniendo (nulo) pero ¿hay alguna forma de evitar este problema porque mis cheques para NULL no están detectando esto y sigue seg? falla mi programa – CF711

+0

@ Chris: conviértalo en un tipo entero e imprímalo como un entero en lugar de como un puntero (este también es un comportamiento definido por la implementación, pero por lo general está bien respaldado). El tipo 'uintptr_t' definido en' 'debería ayudarlo. – dreamlax

0

Si su pregunta se refiere a la comparación del valor del puntero a NULL, el valor impreso por printf() no debería importar. Todavía se puede hacer si (PTR == NULL) para eso.

    ptr = (nil) y NULL = (nil) => ptr = NULL :)

El error que está recibiendo se debe a algún otro motivo.

0

uso

printf("Head: %s, %d, %p\n", front, front, front); 

para imprimir Head: (null), 0, (nil)

Gracias Packia

0

Después de emitir el puntero estructura con int, que proporciona la condición de esperar con sentencia if ..

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p); 
printf("The address of the variable is---ps->p---After Deletion-- %d \n",(int)ps->p); 
if((int)ps->p){ 
printf("Again in Free\n"); 
doFree((void **)&ps->p); 
} 

SALIDA: -

La dirección de la variable es --- PS-> p --- Después Deletion-- nula La dirección de la variable es --- PS-> p --- Después Deletion-- 0

se evaluará como falsa para la condición si.