динамическая память для двумерного массива символов - PullRequest
7 голосов
/ 10 апреля 2010

Я объявил массив char ** обр .; Как инициализировать память для двумерного массива символов.

Ответы [ 6 ]

9 голосов
/ 10 апреля 2010

Один из способов сделать следующее:

char **arr = (char**) calloc(num_elements, sizeof(char*));

for ( i = 0; i < num_elements; i++ )
{
    arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}

Довольно ясно, что здесь происходит - сначала вы инициализируете массив указателей, затем для каждого указателя в этом массиве вы выделяете массив символов.

Вы можете заключить это в функцию. Вам также понадобится free (), после использования, например:

for ( i = 0; i < num_elements; i++ )
{
    free(arr[i]);
}

free(arr);

Я думаю, что это самый простой способ сделать то, что вам нужно.

8 голосов
/ 10 апреля 2010

Существует два варианта выделения массива типа char **

Я переписал эти 2 примера кода из comp.lang.c FAQ (который также содержит хорошую иллюстрацию этих двух типов массивов)

Опция 1 - сделать одно выделение на строку плюс одно для указателей на строки.

char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
  array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately

Вариант 2 - Выделить все элементы вместе и выделить указатели строк:

char **array2 = malloc(nrows * sizeof(char *));      // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
  array2[i] = array2[0] + i * ncolumns;

Вы также можете выделить только один блок памяти и использовать некоторую арифметику для получения элемента [i,j]. Но тогда вы бы использовали char*, а не char**, и код усложняется. например arr[3*ncolumns + 2] вместо arr[3][2]

3 голосов
/ 10 апреля 2010

Возможно, вам лучше использовать одномерный массив:

char *arr = calloc(WIDTH*HEIGHT, sizeof(arr[0]));

for (int y=0; y<HEIGHT; y++)
    for (int x=0; x<WIDTH; x++)
        arr[WIDTH*y+x] = 2*arr[WIDTH*y+x];

free(arr);
1 голос
/ 19 декабря 2016
char **array;
int row,column;
char temp='A';
printf("enter the row");
scanf("%d",&row);
printf("enter the column");
scanf("%d",&column);
array=(char **)malloc(row*sizeof(char *));
for (int i=0;i<row;i++)
{
    array[i]=(char*)malloc(column*sizeof(char));
}
1 голос
/ 08 июня 2012

Используйте следующий трюк:

typedef char char2D[1][1];

char2D  *ptr;

ptr = malloc(rows * columns, sizeof(char));

for(i = 0; i < rows; i++)
    for(j = 0; j < columns; j++)
        (*ptr)[i][j] = char_value;
0 голосов
/ 01 октября 2017

Для двумерного массива char, если вы имеете в виду матрицу строк, это можно сделать следующим образом.

int nChars = 25; // assuming a max length of 25 chars per string
int nRows = 4;
int nCols = 6;
char *** arr = malloc(nRows * sizeof(char **));
int i;
int j;
for(i = 0; i < nCols; ++i)
{
    arr[i] = malloc(nCols * sizeof(char *));
}
for(i = 0; i < nRows; ++i)
{
    for(j = 0; j < nCols; ++j)
    {
        arr[i][j] = malloc(nChars * sizeof(char));
        sprintf(arr[i][j], "Row %d Col %d", i, j);
    }
}

Для печати двумерного массива символов (матрицы строк (массивов символов))

for(i = 0; i < nRows; ++i)
{
    for(j = 0; j < nCols; ++j)
    {
        printf("%s  ", arr[i][j]);
    }
    printf("\n");
}

Результат

Row 0 Col 0    Row 0 Col 1    Row 0 Col 2    Row 0 Col 3    Row 0 Col 4    Row 0 Col 5  
Row 1 Col 0    Row 1 Col 1    Row 1 Col 2    Row 1 Col 3    Row 1 Col 4    Row 1 Col 5  
Row 2 Col 0    Row 2 Col 1    Row 2 Col 2    Row 2 Col 3    Row 2 Col 4    Row 2 Col 5  
Row 3 Col 0    Row 3 Col 1    Row 3 Col 2    Row 3 Col 3    Row 3 Col 4    Row 3 Col 5  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...