2012-02-29 64 views
2

有人能告诉我是否有一种方法来保留在LOOKUP数组中查找数组的正确大小?由于C一旦将数组视为int指针,C就会丢失信息,因此我不得不采取这种措施。sizeof一个静态数组在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 
} 

回答

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; 
} 
6

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

我有一种感觉,它是不可能的,因为只要您将数组视为int指针,C就会丢失信息。

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

+0

是的,我是这么认为的,怎么刺激性。谢谢 – oggmonster 2012-02-29 16:46:54

+1

这是您在必须使用C代码时牺牲的一种安慰。从编码的角度来看,高级语言使这种事情变得更加容易。 – 2012-02-29 16:51:17

+0

刺激,但更快。 – m0skit0 2012-02-29 17:27:09

0

LOOKUP是一个指针数组,而不是数组数组。指针的大小为您的系统上的4个字节,这样的sizeof(查找[0])将评估为4