【问题标题】:Sizeof C array with integers (in Obj-C)具有整数的 Sizeof C 数组(在 Obj-C 中)
【发布时间】:2011-06-14 18:09:21
【问题描述】:

myclass.h:

#define BUTTON_NAVI 41;
#define BUTTON_SETTINGS 42;
#define BUTTON_INFO 43;

myclass.m:

int btnNavi = BUTTON_NAVI;
int btnSettings = BUTTON_SETTINGS;
int btnArray[2] = {btnNavi, btnSettings};
NSLog(@"count = %i", sizeof(btnArray));
[self addToolbarButtons:btnArray];

-> 日志:count = 8

8?!我做错了什么?

而“addToolbarButtons”里面的计数是 4... :-(

编辑:

- (void)addToolbarButtons:(int[])buttonIdArray {
    NSLog(@"count = %i", sizeof(buttonIdArray));
}

-> 日志:count = 4

【问题讨论】:

  • 很确定这些分号不应该出现在定义中,但它们不应该改变您的任何代码行为。

标签: objective-c c arrays c-preprocessor


【解决方案1】:

sizeof 以字节为单位为您提供大小,8 个字节听起来适合 2 个整数(每个 32 位或 4 个字节)。

如果您想要的是数组的长度,您可以执行sizeof(arr) / sizeof(arr[0]),这将为您提供整个数组的大小除以每个元素的大小。在这种情况下,您将获得8 / 4 == 2,这正是我认为您所期望的。

编辑 要回答您的第二个问题,当您将数组传递给方法时,实际上是在将 pointer 传递给数组。因此,指针的大小也是 32 位或 4 字节。如果你想让函数知道数组的长度,你还需要将它的长度与所述指针一起传递。

【讨论】:

  • 谢谢!但为什么我在“addToolbarButtons”中得到“4”? (我编辑我的问题)
  • 如果 Obj-C 在这方面表现得像 C(我认为确实如此),那是因为 addToolbarButtons 接收到一个指针值,该指针值表示数组中第一个元素的地址。 C 语义使得数组类型的表达式在大多数情况下被隐式转换为指针类型。
【解决方案2】:

sizeof 以字节为单位给出数组的大小。一个 int 是 4 个字节,所以一个 2 元素的 int 数组将是 8 个字节。

然而,sizeof 不会在你的方法中做你想做的事。当一个 C 数组被传递给一个函数(或方法)时,它实际上是作为一个指针传递的,sizeof 将返回一个指针的大小。您应该修改您的方法以采用长度参数:

- (void)addToolbarButtons:(int *)buttonIdArray length:(size_t)len
{
    NSLog(@"count = %d", len);
}

【讨论】:

    【解决方案3】:

    sizeof 运算符为您提供传递给它的东西的大小(以字节为单位)。如果 int 是 4 个字节,那么两个 ints 的数组是 8 个字节。

    但是,sizeof 是对变量本身的编译时检查。在运行时,数组的边界是未知的——在定义变量的范围之外也不知道它们。当您声明参数 (int[])buttonIdArray 时,编译器会将其脱糖到 (int *)buttonArray — 它只是一个普通的 int 指针。所以当你执行sizeof(buttonArray) 时,它会告诉你指针的大小,4。

    因为语言不会为您记录它们的大小,所以使用 C 数组是一件痛苦的事情。您必须将数组中的元素数量传递给作用于它的每个函数和方法。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多