How can I allocate a 2D array using double pointers?

前端 未结 3 877
我寻月下人不归
我寻月下人不归 2020-12-19 22:04

I want to know how can I form a 2D array using double pointers?

Suppose my array declaration is:

char array[100][100];

How can I ge

相关标签:
3条回答
  • 2020-12-19 22:35
    char **array;
    array = malloc(100 * sizeof (char *));
    

    Now you have an array of 100 char pointers.

    0 讨论(0)
  • 2020-12-19 22:44

    Typical procedure for dynamically allocating a 2D array using a pointer-to-pointer::

    #include <stdlib.h>
    ...
    T **arr; // for any type T
    arr = malloc(sizeof *arr * ROWS);
    if (arr)
    {
      size_t i;
      for (i = 0; i < ROWS; i++)
      {
        arr[i] = malloc(sizeof *arr[i] * COLS);
        if (arr[i])
          // initialize arr[i]
        else
          // panic
      }
    }
    

    Note that since you're allocating each row separately, the contents of the array may not be contiguous.

    0 讨论(0)
  • 2020-12-19 22:50

    To create a char array using malloc which can be accessed as a 2D array using a[x][y] and with the data contiguous in memory, one could do:

    /* NOTE: only mildly tested. */
    char** allocate2Dchar(int count_x, int count_y) {
        int i;
    
        # allocate space for actual data
        char *data = malloc(sizeof(char) * count_x * count_y);
    
        # create array or pointers to first elem in each 2D row
        char **ptr_array = malloc(sizeof(char*) * count_x);
        for (i = 0; i < count_x; i++) {
            ptr_array[i] = data + (i*count_y);
        }
        return ptr_array;
    }
    

    Note that the returned ptr_array is a pointer to the array of row pointers. The address of the actual data can be referenced using ptr_array[0] (first col of first row would be the beginning of the data).

    For deallocation, a normal free() on ptr_array would be insufficient as the data array itself will still be kicking about.

    /* free data array first, then pointer to rows */
    void free2Dchar(char** ptr_array) {
        if (!ptr_array) return;
        if (ptr_array[0]) free(ptr_array[0]);
        free(ptr_array);
    }
    

    Example usage:

    #define ROWS 9
    #define COLS 9
    int main(int argc, char** argv) {
        int i,j, counter = 0;
        char **a2d = allocate2Dchar(ROWS, COLS);
    
        /* assign values */
        for (i = 0; i < ROWS; i++) {
            for (j = 0; j < COLS; j++) {
                a2d[i][j] = (char)(33 + counter++);
            }
        }
    
        /* print */
        for (i = 0; i < ROWS; i++) {
            for (j = 0; j < COLS; j++) {
                printf("%c ", a2d[i][j]);
            }
            printf("\n");
        }
    
        free2Dchar(a2d);
        return 0;
    }
    

    The above code in action:

    [me@home]$ gcc -Wall -pedantic main.c
    [me@home]$ ./a.out
    ! " # $ % & ' ( ) 
    * + , - . / 0 1 2 
    3 4 5 6 7 8 9 : ; 
    < = > ? @ A B C D 
    E F G H I J K L M 
    N O P Q R S T U V 
    W X Y Z [ \ ] ^ _ 
    ` a b c d e f g h 
    i j k l m n o p q 
    
    0 讨论(0)
提交回复
热议问题