How do I work with dynamic multi-dimensional arrays in C?

前端 未结 9 1764
庸人自扰
庸人自扰 2020-11-22 05:14

Does someone know how I can use dynamically allocated multi-dimensional arrays using C? Is that possible?

9条回答
  •  庸人自扰
    2020-11-22 05:59

    With dynamic allocation, using malloc:

    int** x;
    
    x = malloc(dimension1_max * sizeof(*x));
    for (int i = 0; i < dimension1_max; i++) {
      x[i] = malloc(dimension2_max * sizeof(x[0]));
    }
    
    //Writing values
    x[0..(dimension1_max-1)][0..(dimension2_max-1)] = Value; 
    [...]
    
    for (int i = 0; i < dimension1_max; i++) {
      free(x[i]);
    }
    free(x);
    

    This allocates an 2D array of size dimension1_max * dimension2_max. So, for example, if you want a 640*480 array (f.e. pixels of an image), use dimension1_max = 640, dimension2_max = 480. You can then access the array using x[d1][d2] where d1 = 0..639, d2 = 0..479.

    But a search on SO or Google also reveals other possibilities, for example in this SO question

    Note that your array won't allocate a contiguous region of memory (640*480 bytes) in that case which could give problems with functions that assume this. So to get the array satisfy the condition, replace the malloc block above with this:

    int** x;
    int* temp;
    
    x = malloc(dimension1_max * sizeof(*x));
    temp = malloc(dimension1_max * dimension2_max * sizeof(x[0]));
    for (int i = 0; i < dimension1_max; i++) {
      x[i] = temp + (i * dimension2_max);
    }
    
    [...]
    
    free(temp);
    free(x);
    

提交回复
热议问题