es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Array dinámico de cadenas en C.

Quiero crear un arreglo de tamaño variable que almacene cadenas de hasta un máximo de 40 caracteres. He investigado y encontrado el siguiente código, el cual crea un arreglo dinámico de enteros.

typedef struct {
  int *array;
  size_t used;
  size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
  a->array = malloc(initialSize * sizeof(int));
  a->used = 0;
  a->size = initialSize;
}

void insertArray(Array a, int element) {
  // a->used es el número de entradas utilizadas, ya que a->array[a->used++] actualiza a->used sólo *después de que se haya accedido al arreglo.
  // Por lo tanto, a->used puede llegar hasta a->size
  if (a->used == a->size) {
    a->size *= 2;
    a->array = realloc(a->array, a->size * sizeof(int));
  }
  a->array[a->used++] = element;
}

void freeArray(Array *a) {
  free(a->array);
  a->array = NULL;
  a->used = a->size = 0;
} 

Actualmente estoy intentando modificar el código para que funcione para mi problema. Hasta ahora, he creado lo siguiente:

typedef struct {
  size_t used;
  size_t size;
  char *array[][40];
} Array;

void initArray(Array *a, size_t initialSize) {
  a->array = malloc(initialSize * sizeof(char));
  a->used = 0;
  a->size = initialSize;
}

void insertArray(Array a, char element) {
  // a->used es el número de entradas utilizadas, ya que a->array[a->used++] actualiza a->used sólo *después de que se haya accedido al arreglo.
  // Por lo tanto, a->used puede llegar hasta a->size
  if (a->used == a->size) {
    a->size *= 2;
    a->array = realloc(a->array, a->size * sizeof(char));
  }
  strcpy(a->array[a->used++], element);
} 

Finalmente:

Array a;
char srcname[40];
initArray(&a, 100); 
insertArray(a, srcname);

Esto produce una falla de segmentación. Aunque he investigado, no he logrado crear un arreglo dinámico funcional de cadenas. Cualquier guía sería apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede intentar modificar el código de la siguiente manera:

    typedef struct {
      char (*array)[40];
      size_t used;
      size_t size;
    } Array;
    
    void initArray(Array *a, size_t initialSize) {
      a->array = malloc(initialSize * sizeof(char[40]));
      a->used = 0;
      a->size = initialSize;
    }
    
    void insertArray(Array *a, char *element) {
      // a->used es el número de entradas utilizadas, porque a->array[a->used++] actualiza a->used solo *después* de que se haya accedido al array.
      // Por lo tanto, a->used puede llegar a a->size
      if (a->used == a->size) {
        a->size *= 2;
        a->array = realloc(a->array, a->size * sizeof(char[40]));
      }
      strcpy(a->array[a->used++], element);
    } 
    

    Por último

    Array a;
    char srcname[40];
    initArray(&a, 100); 
    insertArray(&a, srcname); 
    

Comments are closed.