【问题标题】:Objective-c: why is 0 + 20 = 160?Objective-c:为什么 0 + 20 = 160?
【发布时间】:2015-07-30 02:00:27
【问题描述】:

我的应用中发生了一件奇怪的事情。我有以下NSInteger

NSInteger *contentStart;

然后在viewDidLoad,我做到了:

contentStart=0;

然后用另一种方法,我做到了:

contentStart = contentStart + 20;
NSLog(@"%d", (int)contentStart);

输出是 160 而不是 20!

我尝试了所有方法,我什至尝试了contentStart+=20,得到了相同的结果。

谁能告诉我这里发生了什么?我要疯了。

非常感谢。

【问题讨论】:

  • contentStart = contentStart + 20之前尝试NSLogcontentStart的值
  • 我做了,它显示值0
  • %d = 不是整数。查看您的 at 格式说明符。
  • 我发现了一个错误。您应该使用NSInteger contentStart 而不是NSInteger *contentStart
  • didLoad 是什么意思?是一些自定义方法,还是实际覆盖的- (void)viewDidLoad

标签: objective-c


【解决方案1】:

由于 sizeof(NSInteger) 是 8 个字节,您将指针移动 20 * sizeof(NSInteger) 等于 160

【讨论】:

    【解决方案2】:

    NSInteger* 是指向NSInteger 变量的指针。 当您执行 contentStart + 20 时,这意味着您将指针移动到 20 NSInteger's。看起来你有 64 位环境。在 64 位环境中,一个 NSInteger 需要 8 个字节。所以 8 * 20 = 160; 这就是为什么 contentStart 的值变为 160 而不是 20。

    这是使用指针的计算。

    【讨论】:

    • 所以如果 OP 是 [NSLog(@"%d", (int)&contentStart)];,那会起作用吗?通过取消引用指针?
    • @MattyAyOh,不,它将打印修剪为 32 位 contentsStart 的地址。 int8_t* contentStart; 也会给出预期的结果。
    • 请原谅我的纠缠——我可能会启动一个示例应用程序来解决这些问题......但我已经打开了 :) 好的,我得到了第一部分,第二部分,为什么取消引用时指向 int8_t 的指针会起作用但 NSInteger 不起作用吗?
    • 就像 trojanfoe 写道:sizeof(NSInteger) == 8。而sizeof(int8_t) == 1 - 一个字节。因此将指针移动到 20 int8_t 会将指针移动 20 个字节。但是当你做算术时,你应该使用普通变量,而不是指针。例如,当您解析二进制数据流以进行归档或加密时,使用指针可能很有用。
    【解决方案3】:

    问题是您要添加20 * sizeof(NSInteger),因为contentStart 的类型是NSInteger *,所以您正在执行指针运算。

    我假设您正在构建 64 位 sizeof(NSInteger) == 8

    【讨论】:

      【解决方案4】:

      替换

      NSInteger *contentStart;

      NSInteger contentStart;

      你很高兴 :)

      说明

      NSInteger 是原始类型,这意味着它可以本地存储在堆栈中。您不需要使用指针来访问它。

      想要完整解释的可以看this解答

      【讨论】:

      • 如果您能解释为什么使用指针会导致此问题,将会很有帮助。
      • @Cy-4AH 因为您打印的是指针的地址,而不是它指向的值。
      • 谢谢,我不太明白指针的含义。但现在我知道了。
      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 2023-01-12
      • 1970-01-01
      • 2012-05-07
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多