C динамическое выделение для сетки, когда строки неизвестны

Я пытаюсь выделить массив символов * в C. Я заранее знаю количество столбцов, но не строк, и я хочу выделять строки по мере необходимости.

Я пытался использовать:

char *(*data)[NUMCOLS]; //declare data as pointer to array NUMCOLS of pointer to char

data = malloc(sizeof(char*));

теперь приведенная выше строка должна выделять данные [0] ... правильно? тогда я должен иметь возможность использовать строку, например

data[0][1] = strdup("test");
 .
 ..
data[0][NUMCOLS-1] = strdup("temp");

Я получаю ошибку seg. Я не могу понять, что здесь не так. может кто-нибудь, пожалуйста, помогите.


person vyom    schedule 10.10.2009    source источник


Ответы (2)


я бы сделал так:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(){
  char ***a = NULL;

  a       = realloc( a, 1 * sizeof(char **) ); // resizing the array to contains one raw
  a[0]    = malloc(     3 * sizeof(char  *) ); // the new raw will contains 3 element
  a[0][0] = strdup("a[0][0]");
  a[0][1] = strdup("a[0][1]");
  a[0][2] = strdup("a[0][2]");


  a       = realloc( a, 2 * sizeof(char **) ); // resizing the array to contains two raw
  a[1]    = malloc(     3 * sizeof(char  *) ); // the new raw will contains 3 element
  a[1][0] = strdup("a[1][0]");
  a[1][1] = strdup("a[1][1]");
  a[1][2] = strdup("a[1][2]");

  for( int rows=0; rows<2; rows++ ){
    for( int cols=0; cols<3; cols++ ){
      printf( "a[%i][%i]: '%s'\n", rows, cols, a[rows][cols] );
    }
  }
}
person sambowry    schedule 10.10.2009

Вы не выделили достаточно памяти для вещей, которые хотите сохранить. В данном конкретном случае это будет:

data=malloc(sizeof(char*)*NUMCOLS*NUMROWS);

Чтобы изменить размер массива, вы должны использовать:

data=realloc(data,(size_t)sizeof(char*)*NUMCOLS*NEW_NUMROWS);

Подробнее об этом (перераспределении) здесь

person aviraldg    schedule 10.10.2009
comment
data = malloc(NUMROWS * sizeof *data); — еще один вариант. - person caf; 11.10.2009
comment
@caf Прежде всего, вы получите сообщение об ошибке, так как вы не указали тип данных для sizeof. Во-вторых, когда я сказал NUMCOLS, это было синонимом длины этой конкретной строки. Во-вторых: в контексте вопроса ОП данные являются указателем, поэтому, если данные уже были выделены и ваш код скомпилирован, тогда ему не хватило бы памяти для выделения. - person aviraldg; 11.10.2009
comment
Этот подход с char ***data? или символ *(*данные)[] - person vyom; 11.10.2009
comment
Это для персонажа ***. Пс. Пожалуйста, не изменяйте типы, помещая скобки. Если вы добавите еще один, он станет указателем на функцию... - person aviraldg; 11.10.2009