【问题标题】:sizeof operation on a 2D array二维数组的 sizeof 操作
【发布时间】:2016-03-08 05:50:31
【问题描述】:

如果我将二维数组定义为:

char *tablechar[][2] = {
      {"0",  "Innova"},
      {"2",  "Brio"  },
      {"3",  "Alto"  },
      {"4",  "Bolero"},
      {"5",  "Swift" }
};

和代码在同一个文件中:

printf("Value = %d\n",sizeof(tablechar));
printf("Value = %d\n",sizeof(tablechar[0]));
printf("Num of rows = %d\n",sizeof(tablechar)/sizeof(tablechar[0]));

输出如预期:

Value = 40
Value = 8
Num of rows = 5

现在,我将这个二维矩阵传递给一个函数,其定义为:

void printstuff(char *tab[][2])
{
   printf("Value = %d\n",sizeof(tab));
   printf("Value = %d\n",sizeof(tab[0]));
   printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0]));
}

我得到以下输出:

Value = 4
Value = 8
Num of rows = 0

在上述函数中带有编译器警告:

为什么这样sizeof(tab)和sizeof(tablechar)的值不同?

【问题讨论】:

标签: c arrays string multidimensional-array


【解决方案1】:

tablechar 是一个实际的数组,但参数tab 将被视为指向具有指定类型的数组元素的指针,因此sizeof(tab) 将是指针的大小,而sizeof(tablechar) 将是指针的大小数组。

顺便说一句,将错误类型的数据传递给printf() 会调用未定义的行为。您必须使用%zu 而不是%d 来打印size_tsizeof 运算符将对其进行评估。

【讨论】:

  • 有什么方法可以在函数中获取二维数组形式参数,该函数可以被解读为数组本身,而不是指针?
【解决方案2】:

tablecharchar 指针数组的数组,而函数参数 tab 是指向 2 个 char 指针数组的指针。

void printstuff(char *tab[][2])  

等价于

void printstuff(char *(*tab)[2])   

sizeof(tab) 将给出指针的大小而不是数组tablechar。在 C 中,有一种方法可以将数组传递给函数。当您将数组传递给函数时,然后根据 C 规则数组衰减为指向其第一个元素的指针。
永远记住数组不是指针

【讨论】:

    【解决方案3】:

    为:

    char *tablechar[][2] = {
          {"0",  "Innova"},
          {"2",  "Brio"  },
          {"3",  "Alto"  },
          {"4",  "Bolero"},
          {"5",  "Swift" }
    };
    

    tablechar的类型是一个有five元素的数组,每个元素的类型是char* [2]。所以sizeof(tablechar) = 5 * sizeof(char* [2]) = 5 * 8 = 5 * 4 * 2

    如果tablechar[0] 的类型是char* [2],那么sizeof(tablechar[0]) = sizeof(char*) * 2 = 4 * 2 = 8

    void printstuff(char *tab[][2])
    {
       printf("Value = %d\n",sizeof(tab));
       printf("Value = %d\n",sizeof(tab[0]));
       printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0]));
    }
    

    tab 的类型是char**,所以sizeof(tab) = 4tab[0]的类型是char* [2],所以sizeof(tab[0]) = 8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2012-04-01
      • 2015-06-21
      • 2012-03-23
      相关资源
      最近更新 更多