Dynamic Memory for 2D Char Array

Dynamic Memory for 2D Char Array

I have declared an array char **arr; How to initialize the memory for the 2D char array.

1

6 Answers

One way is to do the following:

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

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

It's fairly clear what's happening here - firstly, you are initialising an array of pointers, then for each pointer in this array you are allocating an array of characters.

You could wrap this up in a function. You'll need to free() them too, after usage, like this:

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

free(arr);

I think this the easiest way to do things and matches what you need.

4

There are two options for allocating an array of type char **

I've transcribed these 2 code samples from the comp.lang.c FAQ (which also contains a nice illustration of these two array types)

Option 1 - Do one allocation per row plus one for the row pointers.

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

Option 2 - Allocate all the elements together and allocate the row pointers:

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;

You can also allocate only one memory block and use some arithmetic to get at element [i,j]. But then you'd use a char* not a char** and the code gets complicated. e.g. arr[3*ncolumns + 2] instead of arr[3][2]

You might be better off with a one dimensional array:

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);

Use the following trick:

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;
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));
}

By 2D char array, if you mean a matrix of strings then it may be done in the following way.

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);
    }
}

To print the 2D char array(matrix of strings(char arrays))

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

Result is

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  

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.