dynamic memory for 2D char array

后端 未结 6 503
别那么骄傲
别那么骄傲 2020-12-01 07:03

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

相关标签:
6条回答
  • 2020-12-01 07:41

    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.

    0 讨论(0)
  • 2020-12-01 07:43

    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;
    
    0 讨论(0)
  • 2020-12-01 07:44

    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]

    0 讨论(0)
  • 2020-12-01 07:46

    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);
    
    0 讨论(0)
  • 2020-12-01 07:46

    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  
    
    0 讨论(0)
  • 2020-12-01 07:48
    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));
    }
    
    0 讨论(0)
提交回复
热议问题