Calloc con estructura con punteros en C

5 minutos de lectura

Sé que calloc solicita memoria para usar, escribe 0 en todos los bits y luego le devuelve un puntero.

Mi pregunta es: si uso calloc con una estructura que contiene punteros, ¿tendrán esos punteros el valor NULL o debo configurarlos para que apunten a NULL?

struct a{
char * name;
void * p;
}* A;

Entonces, básicamente, ¿name y p apuntarán a NULL después de haber usado calloc con struct a?

¡Gracias!

De alguna manera has obtenido muchas respuestas incorrectas. C no requiere que la representación de los punteros nulos sean todos cero bits. Mucha gente piensa erróneamente que sí, ya que una expresión constante entera con valor 0, convertida en un puntero, se convierte en un puntero nulo.

Dicho esto, en todos los sistemas del mundo real, los punteros nulos son todos cero bits, y calloc es una forma perfectamente razonable de obtener una matriz de punteros inicializados con puntero nulo en el mundo real.

  • +1: la única respuesta que he visto que está cerca de la derecha. Creo que algunos sistemas IBM y Unisys usan punteros nulos en los que no todos los bits son cero. De hecho, un x86 también puede: un valor de segmento de 0 da un puntero nulo, independientemente del desplazamiento. Todos los bits cero funcionarán, pero también son posibles otros valores de puntero nulo.

    – Jerry Ataúd

    2 de mayo de 2011 a las 13:28


  • Solo porque algún segmento distinto de cero: el puntero de desplazamiento puede evaluarse igual que la dirección lineal cero, no lo llamaría un “puntero nulo”. El compilador de CA tendría que ir a generar código para realizar un trabajo adicional costoso para verificar los punteros nulos si llamara a estos punteros nulos, y no mejoraría la calidad de la implementación ya que solo la representación creada por el compilador debe tratarse como un puntero nulo por el código que genera (los punteros nulos nunca surgen de la aritmética, solo de expresiones constantes).

    – R.. GitHub DEJA DE AYUDAR A ICE

    2 mayo 2011 a las 13:35

  • En realidad el solamente Las razones que se me ocurren para usar bits distintos de cero para el puntero nulo son (1) si la dirección 0 debe ser direccionable, o (2) si desea que el puntero nulo no haga referencia para generar una trampa, y la dirección 0 no genera una trampa, pero alguna otra dirección sí lo hace. Es siempre válidoindependientemente del hardware, para hacer una implementación de C en la que los punteros nulos sean todos cero bits y, por lo tanto, a falta de una razón convincente para no hacerlo, los implementadores siempre deben usar todos los bits cero como la representación del puntero nulo.

    – R.. GitHub DEJA DE AYUDAR A ICE

    2 mayo 2011 a las 13:37

  • @R. No tan. No es una cuestión de evaluar a la misma dirección lineal. Parte de cómo Intel define el modo protegido es que el segmento 0 no se puede desreferenciar (hay no dirección lineal asociada con él). No se necesitaría ningún trabajo adicional costoso: solo tiene que verificar la parte del segmento e ignorar el desplazamiento.

    – Jerry Ataúd

    2 mayo 2011 a las 13:38

  • @R. Puedes discutir sobre cómo las cosas deberían ser todo lo que quieras, no cambiará cómo son realmente las cosas.

    – Jerry Ataúd

    2 de mayo de 2011 a las 13:39

Calloc con estructura con punteros en C
ryan haining

La respuesta de R. es buena, pero me gustaría agregar las comillas estándar para respaldar esto y mostrar una forma de inicializar 0 su estructura que, de hecho, produce punteros NULL.

Desde N1548 (borrador C11)

7.22.3.2 La función calloc asigna espacio para una matriz de objetos nmemb, cada uno de los cuales tiene un tamaño. El espacio se inicializa a todos los bits cero.[289]

La nota a pie de página dice (énfasis añadido):

Tenga en cuenta que esto no tiene por qué ser lo mismo que la representación de punto flotante cero o una constante de puntero nulo.

Si bien un puntero nulo generalmente se representa como todos los bits 0, esta representación no está garantizada. Para responder a su pregunta directamente, no no puedes confiar en el calloc()Los punteros de la estructura serían NULL.


Si desea configurar todos los punteros contenidos de una estructura asignada dinámicamente para NULL puedes usar lo siguiente:

struct a *s = malloc(sizeof *s);
*s = (struct a){0};

C11:

6.7.9.21
Si hay menos inicializadores en una lista entre llaves que elementos o miembros de un agregado, […] el resto del agregado se inicializará implícitamente igual que los objetos que tienen una duración de almacenamiento estática

y

6.7.9.10
… Si un objeto que tiene una duración de almacenamiento estático o de subprocesos no se inicializa explícitamente, entonces:
— si tiene un tipo de puntero, se inicializa a un puntero nulo;

C requiere que tengas al menos un elemento dentro de las llaves, por eso uso {0} en lugar de {}. El resto de los elementos se inicializan de acuerdo con las reglas anteriores, lo que da como resultado punteros nulos. Por lo que puedo decir, las reglas para esto son las mismas en C11 y C99.

La norma ISO C para calloc requiere que inicialice todo para 0. Eso significa que si termina viendo la memoria asignada por calloc como punteros, de hecho contendrá inicialmente punteros NULL (0).

  • “Ser 0” es impreciso. Lo que quiere decir es “si todos los bits cero son la representación de los punteros nulos”.

    – R.. GitHub DEJA DE AYUDAR A ICE

    2 mayo 2011 a las 13:31

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad