内存地址不连续
创建动态数组,如果是用for循环嵌套的话,创建出来的数组地址不连续,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
   | #include <iostream>
  #define ROW 2 #define COL 3
 
 
  void delete_array(int **p, size_t dim1);
  int **create_array(size_t dim1, size_t dim2);
 
 
 
 
  int main() {     int **m;     m = create_array(ROW, COL);          for (size_t i = 0; i < ROW; i++)         for (size_t j = 0; j < COL; j++) {             m[i][j] = i + j;         }          for (int i = 0; i < ROW; i++) {
          printf("m[%d] = %p\n", i, m[i]);
          for (int j = 0; j < COL; j++) {             printf("&m[%d][%d] = %p; m[%d][%d] = %d\n", i, j, &(m[i][j]), i, j, m[i][j]);         }
          printf("\n");     }
      delete_array(m, ROW);     return 0; }
 
  int **create_array(size_t dim1, size_t dim2) {     int **p;
      if ((p = (int **) malloc(dim1 * sizeof(int *))) == NULL)         return NULL;     for (int i = 0; i < dim1; i++) {         if ((p[i] = (int *) malloc(dim2 * sizeof(int))) == NULL)             return NULL;     }
      return p; }
  void delete_array(int **p, size_t dim1) {     for (int i = 0; i < dim1; i++) {         free(p[i]);     }
      free(p); }
   | 
 
运行结果,行与行之间地址不连续:
1 2 3 4 5 6 7 8 9
   | m[0] = 0000018e68931460 &m[0][0] = 0000018e68931460; m[0][0] = 0 &m[0][1] = 0000018e68931464; m[0][1] = 1 &m[0][2] = 0000018e68931468; m[0][2] = 2
  m[1] = 0000018e68931480 &m[1][0] = 0000018e68931480; m[1][0] = 1 &m[1][1] = 0000018e68931484; m[1][1] = 2 &m[1][2] = 0000018e68931488; m[1][2] = 3
   | 
 
内存不连续导致 *(*(a+i)+j) 的值就不等于 a[i][j] 了。
让它连续
修改create_array函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | int **create_array(size_t dim1, size_t dim2) {     int **p;
      if ((p = (int **) malloc(dim1 * sizeof(int *))) == NULL)         return NULL;
      if ((p[0] = (int *) malloc(dim1 * dim2 * sizeof(int))) == NULL)         return NULL;
      for (size_t i = 1; i < dim1; i++)         p[i] = p[i - 1] + dim2; 
      return p; }
  | 
 
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
   | #include <iostream>
  #define ROW 3 #define COL 2
  int **create_array(size_t dim1, size_t dim2);
  void delete_array(int **m);
  int main() {     int **m = create_array(ROW, COL);
      for (int i = 0; i < ROW; i++)         for (int j = 0; j < COL; j++) {             m[i][j] = i + j;         }
      int *start = *m;     int *const end = start + ROW * COL;
      for (; start != end; start++)         printf("%p -> %d\n", start, *start);
      delete_array(m);     return 0; }
  int **create_array(size_t dim1, size_t dim2) {     int **p;
      if ((p = (int **) malloc(dim1 * sizeof(int *))) == NULL)         return NULL;
      if ((p[0] = (int *) malloc(dim1 * dim2 * sizeof(int))) == NULL)         return NULL;
      for (size_t i = 1; i < dim1; i++)         p[i] = p[i - 1] + dim2; 
      return p; }
  void delete_array(int **m) {     free(m[0]);     free(m); }
   | 
 
运行结果:
1 2 3 4 5 6
   | 0000010618531470 -> 0 0000010618531474 -> 1 0000010618531478 -> 1 000001061853147c -> 2 0000010618531480 -> 2 0000010618531484 -> 3
   | 
 
这样就连续了。
创建多维数组
多维数组空间的分配同理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | float ***create_multi_array(int dim1, int dim2, int dim3) {
      float ***ptr = (float ***) malloc(dim1 * sizeof(float **) +                                       dim1 * dim2 * sizeof(float *) +                                       dim1 * dim2 * dim3 * sizeof(float));
      for (size_t i = 0; i < dim1; ++i) {         ptr[i] = (float **) (ptr + dim1) + i * dim2;          for (size_t j = 0; j < dim2; ++j)             ptr[i][j] = (float *) (ptr + dim1 + dim1 * dim2) + i * dim2 * dim3 + j * dim3;     }
      return ptr; }
  |