Allepta
@Allepta

Как клонировать двумерный динамический массив строк?

Приветствую. Используя mysql возникла потребность в клонирование типа MYSQL_ROW row в другой динамический массив для длительного хранения.

mysql_t MysqlSelect(char *base, char *sql)
{
  if(base != NULL && sql != NULL)//входные данные
  {
    if(mysql.array != NULL)// Если было использование ранее то очистить
    {
      for(int step = 0; mysql.array[step]; step++)//очищаю каждый элемент массива
        free(mysql.array[step]);
      
      free(mysql.array);
      
      mysql.array_len = 0;// дефолтное количество элементов
    }
    
    for(int step = 0; step <= (int)strlen(sql); step++)// считаю сколько нужно данных для выборки
      if(sql[step] == ',')
        mysql.array_len++;
      
    mysql.connect = mysql_connection_setup(base);
    mysql.result = mysql_perform_query(mysql.connect, sql);
    
    if((mysql.row = mysql_fetch_row(mysql.result)) != NULL)
    {      
      mysql.array = (char**)malloc(sizeof(mysql.row) * sizeof(char**));// устанавливаю количество элементов
      
      for(int step = 0; step <= mysql.array_len; step++)
      {
        if(mysql.row[step] != NULL)
        {
          mysql.array[step] = (char*)calloc(sizeof(mysql.row[step]), sizeof(mysql.row[step]) * sizeof(char*)); //заполняю элементы
          strcpy(mysql.array[step], mysql.row[step]);
        }
      }
    }
    
    mysql_free_result(mysql.result);
    mysql_close(mysql.connect);
  }
  else
    printf("--> Log: input variables are nulled\n");
  
  return mysql;
}


В целом все работает, но valgrind указывает на утечки памяти, может есть более правильный метод реализации моей задачи?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
for(int step = 0; mysql.array[step]; step++)//очищаю каждый элемент массива
        free(mysql.array[step]);

1.Цикл завершается на первом встреченном пустом элементе.
Судя по логике у вас могут быть пустые строки, под которые память не выделилась, а затем снова могут идти заполненные строки.
2.Кроме того после выделения памяти для mysql.array рекомендую сразу ее обнулять. malloc не зануляет выделенную память - в ней лежит мусор, используйте calloc или memset. Из-аз этого проверка в цикле выше (mysql.array[step]) может срабатывать не корректно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы