Как инициализировать и сохранить данные в 2d массив в C - PullRequest
0 голосов
/ 06 мая 2020

Если бы у меня был 2-мерный массив с несколькими c строками, как бы я инициализировал массив, не зная, сколько c строк будет добавлено в этот массив.

Я попытался инициализировать, как показано ниже но когда я пытаюсь добавить строку c, я получаю сообщение об ошибке при компиляции. Ошибка: явное указание размеров или инициализатор для массива auto или stati c.

static Char data[][100]; 

int main(){
  int i;
  char word[5];

  strcpy(word,"data");

  For(i=0; i < rows; i++){
    strcpy(data[i],word);
  }

}

Таким образом, массив должен содержать, например,

data[][100]= {"data","data"};

Значение строки зависит от того, сколько строк извлекаются из sql, поэтому моя проблема в том, что я хочу каким-то образом динамически создать массив, чтобы он соответствовал размеру строк, извлеченных из SQL.

Любая помощь или информация были бы замечательными.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Если вы заранее не знаете, сколько строк будет, вам нужно либо установить фиксированный максимальный предел для массива static, либо использовать динамическое c выделение массива из char указателей .

При использовании динамического c выделения вы можете malloc сначала «довольно большое число», отслеживать количество строк, а затем realloc, когда у вас заканчивается место.

EDIT: пример псевдокода без обработки ошибок, free () et c

int main (void)
{
  size_t alloc_size = sizeof(char*[100]);
  char** data = malloc(alloc_size); 

  for(size_t i=0; i<rows; i++){
    if(i > alloc_size)
    {
      alloc_size *= 2;
      data = realloc(data, alloc_size);
    }

    size_t str_size = strlen(input)+1;
    data[i] = malloc(str_size);
    memcpy(data[i], input, str_size);
  }
}
0 голосов
/ 06 мая 2020

Вы можете использовать указатель на массив и перераспределение.

#include <stdlib.h> /* for realloc() */
#include <string.h> /* for strcpy() */

int rows = 100; /* for example */

static char (*data)[100] = NULL;

int main(){
  int i;
  char word[100]; /* allocate array, not a single char */

  strcpy(word,"data");

  for(i=0; i < rows; i++){
    char (*newData)[100] = realloc(data, sizeof(*data) * (i + 1));
    if (newData == NULL) { /* allocation error */
      free(data);
      return 1;
    }
    data = newData;
    strcpy(data[i],word);
  }

}
...