Просто чтобы быть ясно, когда вы желаете 2D массив типа char*[20][250]
, что вы просите в C-говорить 20-элементный массив char*[250]
s, каждый из которых представляет собой 250-элементный массив из char *
C-строк (каждый из которых представляет собой массив из char
s).
Поскольку динамически выделенный 2D-массив не является областью памяти, а представляет собой массив указателей на другие массивы, вы не можете сделать это за один шаг. .Распределение, что будет делать то, что вы хотите, будет выглядеть следующим образом:
char ***args;
args = malloc(sizeof(char**[20]));
for (int i = 0; i < 20; ++i) {
args[i] = malloc(sizeof(char*[250]));
// optional, depending on your usage:
for (int j = 0; j < 20; ++j)
args[i][j] = ""; // This makes every `char *` element point to the same location in memory— the location of the compiled-in `""`/`(char *){ '\0' }`.
}
Чтобы освободить память, структура ваших звонков так же, как malloc
-ную кода, но в обратном порядке: иерархическая
for (int i = 0; i < 20; ++i)
free(args[i]);
free(args);
Хорошо, поэтому технически можно выделить его как один большой блок, а затем подключить 20-элементный массив, чтобы указать на нужные смещения в blob. Это свершится, хотя и, как правило, не является необходимым - для большинства случаев использования прирост производительности был бы незначительным (и вам все равно потребуется malloc()
отдельный массив указателей, которые адресуются в 2D-блок). Обычно вы видите только распределение 2D-blob, когда данные массово 2D - такие как данные изображения - и data[x][y]
- синтаксис доступа исключен в пользу синтаксиса data[y * width + x]
, поскольку он не менее эффективен, чем то, что сделает компилятор, и не требует более одного malloc
/free
пара на каждый блок данных.
Downvoted, потому что вопрос не содержит [mcve] ,В результате я не знаю точно, что вы пытаетесь сделать, и ответы пытаются угадать, каков ваш предполагаемый тип данных. – user694733
В заголовке очень ясно, что мой тип данных char * [] [] более конкретно char * [20] [250]. Я хочу инициализировать его, а затем повторно инициализировать его. и у него нет примера, потому что он понятия не имеет, как это сделать. –
Указатели традиционно для начинающих. Неясно, поняли ли вы то, что хотите. Из ответов вы можете видеть, что у них разные идеи о том, что вам нужно делать. Хороший вопрос будет иметь короткий пример использования этой переменной после выделения, чтобы продемонстрировать, что вам действительно нужно. – user694733