代码之家  ›  专栏  ›  技术社区  ›  DenverCoder9

当记录这个数组时,为什么nslog会额外打印一个零?

  •  1
  • DenverCoder9  · 技术社区  · 14 年前

    对于这些变量:

    NSInteger dataStart;
    uint64_t dataSize[1];
    const unsigned char *beginning;
    NSInteger bytesEnd;
    

    …在这些值下:

    dataStart = 499
    dataSize[0] = 427
    beginning = 9060864
    bytesEnd = 9061793
    

    …以下代码:

    NSLog(@"dataStart = %d, dataSize[0] = %d, beginning = %d, bytesEnd = %d",
            dataStart, dataSize[0], (NSInteger)beginning, bytesEnd);
    

    …发送到控制台:

    dataStart = 499, dataSize[0] = 427, beginning = 0, bytesEnd = 9060864
    

    换句话说,在数组后面插入了一个额外的零,从而使其他变量发生碰撞。它一直这样做。我使用的是Xcode3.2.3。这里发生了什么?

    [编辑强调:这不仅仅是打印一个值应该为零的老习惯,因为强制转换是错误的。它插入了一个额外的零,然后打印正确的起始值,在这里它应该打印字节发送,而不是打印字节发送。]

    谢谢,

    2 回复  |  直到 14 年前
        1
  •  2
  •   Frederik Slijkerman    14 年前

    只是猜测一下,但是您是在64位模式下编译的吗?在这种情况下,起始指针是64位,但nsinteger是32位,所以您只打印指针的高阶32位,即零。

    我想这是一个做作的例子,因为没有一个头脑清醒的人会这样做。对吗?

        2
  •  1
  •   Jeff Laing    14 年前

    您的格式选择器错误。%D不足以打印数据大小为[0]的uint64。使用%LD。