簡體   English   中英

C中的靜態數組的sizeof

[英]sizeof a static array in 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
}

不, sizeof是正確的。 LOOKUP[0]的類型為int*sizeof(int*)在您的系統上為4。

我覺得,只要將數組視為int指針,C就會丟失信息,這是不可能的。

那是對的。 你必須跟蹤長度。

主要的問題是,你已經聲明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;
}

LOOKUP是一個指針數組,而不是數組數組。 指針的大小在系統上是4個字節,因此sizeof(LOOKUP [0])將計算為4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM