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