¿Cómo podría inicializar una matriz de estructura a null?

    typedef struct 
    {
        char*title;
        int year;
        int length; //in minutes
    } record;

    record list[1024];
    int j;
    for(j=0;j<1024;++j)
        list[j]=NULL;

Estoy tratando de inicializar una matriz de estructura y permitir que cada elemento que apunte a null inicialmente y gcc me da un error de «tipos incompatibles a la hora de asignar el tipo de ‘registro’ de tipo » void*». ¿Cómo podría solucionarlo? El propósito de hacer esto es cuando puedo acceder a un elemento que soy capaz de ver si tiene datos o simplemente vacío.

  • Las personas a menudo usan memset(list, '\0', sizeof(list));.
  • memset()
  • La matriz no es un array de punteros a records, es una matriz de record valores. Usted puede establecer los elementos de la matriz a NULL porque no son punteros. Esto no es java…
  • Usted está tan a la derecha! Muchas gracias.
  • Yo quería una matriz de punteros no struct..Gracias.
  • Usted debe publicar que como una respuesta.
  • Se declara un array de punteros como record *list[1024]; y todavía se puede zero/anular los punteros con memset(list, '\0', sizeof(list)) y puede que entonces prueba if (list[2] == 0) (o NULL en lugar de 0).

5 Kommentare

  1. 3

    list[1024]; es la matriz de objeto de su estructura, que se tiene acceso como

    list[j].title;
    list[j].year;
    list[j].length; 

    Lo que están haciendo es:

    list[j]=NULL

    list[j] es de tipo record, NULL void*. Supongo que esto no es lo que tienes en mente.

    Cualquiera de inicializar los elementos individuales de la estructura mediante el acceso a ellos de forma individual o uso memset como sugeridas por otros.

  2. 5

    Puede inicializar la matriz en el momento de la declaración de esta manera:

    record list[1024] = {{0}};
    • ¿Cómo puedo comprobar si no hay ningún elemento en este bloque? por ejemplo, la lista[2] está vacío, debo usar if(lista[2]==0) ?
    • Usted puede utilizar title miembro como un centinela para referirse a un elemento que no ha sido inicializado: if (list[2].title == NULL)
    • cuando se trata de asignar una matriz de 1024 entradas, todas 1024 entradas son asignados, presente. Puede comprobar si hay un nombre utilizando list[2].title == 0 (o list[2].title == NULL), pero el espacio está asignado.
    • ¿Por qué es mi respuesta votada abajo?
    • Ni idea; tiene un voto.
    • Yo no downvote, pero quien lo hizo probablemente pensó usted en realidad no responder a la pregunta. No hay tal cosa como un null estructura, excepto tal vez por la convención. Un record objeto con title==NULL, year==0, y length==0 podría ser un registro válido.

  3. 3

    Si quieres hacerlo de una en una en un bucle for, que se vería así

    for(j=0;j<1024;++j)
        list[j]=(record){0,0,0};

    Me gustaría sugerir el uso de memset(list,0,1024*sizeof(record))

    o bzero(list, 1024*sizeof(record))

    Si quieres hacerlo con punteros, entonces usted puede declarar su matriz como esta:

    record * list[1024];

    Entonces usted puede establecer que cada uno de los NULL como eres y malloc cada uno, cuando estés listo para ello.

    • Probablemente debería mencionar que (record){0,0,0} es una C99 compuesto literal, no menos importante, ya que probablemente no es compatible con MSVC. Hay una buena razón para utilizar 1024 * sizeof(record) en lugar de sólo sizeof(list), que cambiará automáticamente al tamaño correcto si la dimensión de list se cambia de 1024 a algún otro número?
    • No puedo pensar en una buena razón para no usar sizeof(list), sólo que no lo he familiarizado con. Yo estaría más cómodo definir una macro para RECORDS_IN_LIST porque siempre me siento mal si hay un número en mi código que no tiene nombre. Entonces tendría RECORDS_IN_LIST*sizeof(record) que me parece muy legible.
  4. 0

    Su matriz no es un array de punteros a records, es una matriz de record valores. Usted puede establecer los elementos de la matriz a NULL porque no son punteros. Esto no es java…

  5. 0

    Mi C es un poco oxidado, pero creo que usted desea que esta:

    record list[1024];
    
    memset((char*)list, '\0', sizeof(record) * sizeof(list));

    porque sizeof(una matriz) devuelve el número de elementos de la matriz, no el tamaño en bytes de la matriz.

    • No es necesario multiplicar sizeof(list) por sizeof(record) porque sizeof(list) es el tamaño en bytes de la lista entera. Esta sería la habilidad de arrollar un largo camino fuera de los límites, que conduce a un accidente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea