3
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

4 回答 4

4

您需要将尺寸存储在某处。该语言不适用于裸 C 数组。您所拥有的只是第一个元素的地址。

于 2012-07-06T13:05:17.927 回答
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 所说,存储标记最后位置的特殊值(正是以零结尾的字符串使用的方法)

于 2012-07-06T15:02:38.660 回答
0

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

(对不起我的英语我是法语:/)

于 2012-07-06T13:34:51.287 回答
0

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

所以你目前拥有的是:

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

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

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

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

于 2012-07-06T14:58:40.627 回答