2D char Array 和 char** 之间的区别(OR、3D char Array 和 char*** 等)

2024-03-13

首先,我已经回顾过这些:

多维数组在内存中是如何格式化的? https://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory

C 中二维数组的内存映射 https://stackoverflow.com/questions/6673719/memory-map-for-a-2d-array-in-c

由此可知,二维数组是不一样作为 char** 但在内存中它们看起来完全一样。这听起来很奇怪,所以我研究了以下内容:

#include <stdio.h>

char func(char** m) {
    return m[0][0]; //only works for char**, already discussed in the other SO question
}

int main() {

    //char a[4][2]; //a 2D char array

    int row = 4, col = 2;   //char**
    char** a = malloc(row * sizeof(char*));
    int i;
    for (i = 0; i < row; i++) {
        a[i] = malloc(col * sizeof(char));
    }

    //checking the output
    printf("      &a = %u\n", &a);
    printf("   &a[0] = %u\n", &a[0]);
    printf("&a[0][0] = %u\n", &a[0][0]);
    printf("       a = %u\n", a);
    printf("    a[0] = %u\n", a[0]);

    //printf(" a[0][0] = %u\n", a[0][0]);   //char value in a[0][0], here a garbage value

    //char m = func(a); //only works for char**, already discussed in the other SO question

    return 0;
}

char** 的可能输出:

      &a = 3209288  //                  &a
   &a[0] = 4083720  // &(*(a+0))      =  a
&a[0][0] = 4083784  // &(*(*(a+0)+0)) = *a
       a = 4083720  //                   a
    a[0] = 4083784  // *(a+0)         = *a

二维字符数组的可能输出:

      &a = 3473104  // &a
   &a[0] = 3473104  //  a
&a[0][0] = 3473104  // *a
       a = 3473104  //  a
    a[0] = 3473104  // *a

char** 的输出很容易理解。但是 2D char 数组的输出看起来很奇怪,尽管它在另一个 SO 问题中进行了讨论。我想不出一个指针x无论什么数据类型,

x = &x = *x

所有这三件事物理上都驻留在同一个内存块中。希望我的困惑可以理解。谁能解释其中的奥秘吗?


当您使用数组名称时,可以是任何表达式,除了&array and sizeof array该名称将自动转换为指向数组第一个元素的指针(char [5][10]将被转换为char (*)[10])。该指针的地址将等于整个数组的地址。
所以,“sizeof(char[5][10])==50”,没有额外的指针。

char arr[5][10];

&a = 3473104 // Address of entire array, (char (*)[5][10])
&a[0] = 3473104 // Address of first row, (char (*)[10])
&a[0][0] = 3473104 // Address of first char, (char *)
a = 3473104 // "a", (char [5][10]), converted to "&a[0]", (char (*)[10])
a[0] = 3473104 // "a[0]", (char[10]), converted ro "&a[0][0]", (char *)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2D char Array 和 char** 之间的区别(OR、3D char Array 和 char*** 等) 的相关文章

随机推荐