C中的静态数组的sizeof

时间:2012-02-29 16:43:00

标签: c

有人能告诉我在LOOKUP数组中查找数据时是否有办法保留数组的正确大小?我有一个感觉,因为当你将数组视为一个int指针时C会丢失信息是不可能的。

const int NUMBERS1[] = {1, 2, 3, 4, 5 };
const int NUMBERS2[] = {1, 2, 3, 4, 5 };
const int* LOOKUP[] = { NUMBERS1, NUMBERS2 };


int main()
{
  int correctSize = sizeof(NUMBERS1); // correctSize == 20
  int wrongSize = sizeof(LOOKUP[0]); // wrongSize == 4
}

3 个答案:

答案 0 :(得分:6)

不,sizeof是正确的。 LOOKUP[0]类型为int*sizeof(int*)在您的系统上为4。

  

我觉得,只要将数组视为int指针,C就会丢失信息,这是不可能的。

这是正确的。你必须跟踪长度。

答案 1 :(得分:5)

主要问题是您已将LOOKUP声明为int的指针数组,而不是int数组的数组,因此{{1}的类型将成为LOOKUP[0]。第二个问题是,大多数情况下,数组表达式将转换为指针表达式,并且数组大小信息将丢失。

如果您需要在数组表达式已转换为指针表达式的任何上下文中知道数组的大小,则需要单独存储该大小。

这是一种方法 - 使用结构将数组指针与数组大小相关联:

int *

答案 2 :(得分:0)

LOOKUP是一个指针数组,而不是数组数组。指针的大小在系统上是4个字节,因此sizeof(LOOKUP [0])将评估为4。