C中的静态数组的sizeof

ogg*_*ter 2 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
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

不,sizeof是对的.LOOKUP[0]是类型的int*,sizeof(int*)在您的系统上是4.

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

那是正确的.你必须跟踪长度.


Joh*_*ode 5

主要的问题是你已经声明LOOKUP是一个指针数组int,而不是数组的数组int,所以类型LOOKUP[0]将是int *.第二个问题是,大多数情况下,数组表达式将转换为指针表达式,并且数组大小信息将丢失.

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

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

#include <stdio.h>

int main(void)
{
  int NUMBERS1[] = {1, 2, 3, 4, 5};
  int NUMBERS2[] = {1, 2, 3, 4, 5, 6};
  int NUMBERS3[] = {1, 2, 3, 4, 5, 6, 7};

  struct arr_and_size {
    int *arrp;
    size_t size;
  };

  struct arr_and_size LOOKUP[] = {{NUMBERS1, sizeof NUMBERS1},
                                  {NUMBERS2, sizeof NUMBERS2},
                                  {NUMBERS3, sizeof NUMBERS3}};

  size_t i = 0;
  for (i = 0; i < sizeof LOOKUP / sizeof *LOOKUP; i++)
    printf("LOOKUP[%zu].arrp = %p, LOOKUP[%zu].size = %zu\n", 
      i, LOOKUP[i].arrp, i, LOOKUP[i].size);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)