如何获取以下数组的大小

时间:2012-07-06 13:03:46

标签: objective-c c arrays

int first[] = {1, 4};
int second[] = {2, 3, 7};

arrayOfCPointers[0] = first;
arrayOfCPointers[1] = second;

NSLog(@"size of %lu", sizeof(arrayOfCPointers[0]) / sizeof(int));

我想拥有一个子数组数组。每个子阵列需要不同的大小。但我需要能够找出每个子阵列的大小吗?

日志不断返回1

4 个答案:

答案 0 :(得分:4)

您需要在某处存储大小。对于裸C阵列,该语言不会这样做。你所拥有的只是第一个元素的地址。

答案 1 :(得分:2)

我会编写一个包装类或结构来保存数组及其元数据(如长度)。

typedef struct tag_arrayholder
{
    int* pArray;
    int  iLen;
}ArrayHolder;


    int first[] = {1, 4};

    ArrayHolder holderFirst;
    holderFirst.pArray = first;
    holderFirst.iArrayLen = sizeof(first) / sizeof(int);

    arrayOfCPointers[0] = holderFirst;

    NSLog(@"size of %lu", arrayOfCPointers[0].iLen);

或者,就像trojanfoe所说的那样,存储标记最后位置的特殊值(恰好是零终止字符串使用的方法)

答案 2 :(得分:0)

“sizeof”指令可用于了解数组使用的字节数,但它仅适用于静态数组,动态一是返回指针大小。因此,对于静态数组,您可以使用以下公式:sizeof(tab)/ sizeof(tab [0])来了解数组的大小,因为第一部分为您提供了以字节为单位的选项卡大小,第二部分为元素的大小,因此结果就是你的数组中的元素数量!但是使用动态数组时,唯一的方法是将数据存储在某处或在数组的末尾放置一个“sentinal value”并编写一个为您计算元素的循环!

(抱歉我的英语我是法语:/)

答案 3 :(得分:0)

NSLog语句正在打印值1,因为您使用的表达式是除以数组的第一个元素的大小(即int的大小)按int的大小。

所以你现在拥有的是:

NSLog(@"size of %lu", sizeof(arrayOfCPointers[0]) / sizeof(int));

如果删除数组括号,您将获得所需的值:

NSLog(@"size of %lu", sizeof(arrayOfCPointers) / sizeof(int));

正如其他答案所指出的那样,如果将数组传递给另一个方法或函数,这将不起作用,因为在这种情况下传递的所有内容都是一个地址。上述工作的唯一原因是因为数组的定义在本地范围内,所以编译器可以使用类型信息来计算大小。