2D阵列上的sizeof操作

时间:2016-03-08 05:50:31

标签: c arrays string multidimensional-array

如果我将2D数组定义为:

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

现在,我将这个2D矩阵传递给一个定义为:

的函数
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

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

compiler_warning

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

3 个答案:

答案 0 :(得分:4)

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

顺便说一下,将具有错误类型的数据传递给printf()会调用未定义的行为。您必须使用%zu代替%d来打印size_t运营商将评估的sizeof

答案 1 :(得分:2)

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

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

相当于

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

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

答案 2 :(得分:1)

有:

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