Pregunta

Estoy trabajando en un proyecto y sigo viniendo a través de este error que no me permitirá completar el proyecto. Cuando inicializar una de mis punteros para apuntar a un objeto que se hizo durante la ejecución del programa y que inicializarlo a NULL. Luego, cuando puedo comprobar para ver lo que se establece en que devuelve un valor de nil. ¿Cómo es posible tal cosa? No creía que los punteros nulos existían en C. ¿Hay alguna forma de evitar esto?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
¿Fue útil?

Solución

%p en printf da formato a un tipo de puntero. Esto va a distinguir un nulo-puntero 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 número entero %d y usar en su 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 se establece un puntero a NULL que es exactamente lo mismo que establecer a 0. Esto funciona para el propuesto de declarar punteros nulos porque la memoria en la dirección 0 no se asignará a su programa.

Otros consejos

Cuando se imprime un puntero usando printf("%p", somePtr), se imprime en un definido por la implementación de manera , de acuerdo con esta cita de la POSIX printf especificación (existe una formulación similar en la especificación C99 también).

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

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

uso

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

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

Gracias Packia

Estoy asumiendo que nada es lo que el depurador le está diciendo. En la mayoría de los compiladores nula es simplemente ed # define a 0 todos modos por lo que el nombre no es tan importante.

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

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

Si su pregunta se refiere a la comparación del valor del puntero 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 obligada por alguna otra razón.

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-- nil La dirección de la variable es --- PS-> p --- Después Deletion-- 0

lo hará evalúa como falsa la condición Si.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top