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

目标C字符数组不匹配

  •  -1
  • JAS  · 技术社区  · 7 年前

    在目标C中获取字符数组的正确格式时,我遇到了一个问题

    正确的样本:

    无符号字符字节[]={2,49,53,49,3,54};

    当打印到调试区域时,我得到以下信息:

    Printing description of bytes:
    (unsigned char [6]) bytes = "\x02151\x0365"
    

    样本不正确:

    然后,我尝试手动用字符填充无符号字符数组(通过生成以下示例的for循环):

    无符号字符bb[64];

    bb[0]=2;

    bb[1]=49;

    bb[2]=52;

    bb[3]=49;

    bb[4]=3;

    当打印到调试区域时,我得到以下信息:

    Printing description of bb: (unsigned char [64]) bb = "\x02151\x036";
    

    这只是一段高级代码,还没有做多少工作,但我需要匹配名为“bytes”的数组,然后才能继续。

    有什么想法吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   CRD    7 年前

    你不会:

    • 说明变量的类型(局部、实例等) bytes bb 是的,这很重要;
    • 显示您的 for

    所以这个答案将是一个 猜测 !

    尝试以下代码(这是一个“完整的”Cocoa应用程序):

    @implementation AppDelegate
    
    unsigned char bytes[] = {2, 49, 53, 49, 3, 54};
    
    char randomBytes[] = { 0x35, 0x0 };
    
    unsigned char bb[64];
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
       for(int ix = 0; ix < 6; ix++) bb[ix] = bytes[ix];
       // breakpoint here
    }
    
    @end
    

    现在在调试器中, 至少在我的机器/编译器组合中,这个结果是 放心 :

    (lldb) p bytes
    (unsigned char [6]) $0 = "\x02151\x0365"
    (lldb) p bb
    (unsigned char [64]) $1 = "\x02151\x036"
    

    我认为这再现了你的结果。那么到底发生了什么?

    变量 字节数 是一个 大堆 但由于是字符,调试器选择将其解释为 C字符串 显示时,请注意值周围的双引号和 \x

    C字符串终止于空(零)字节,因此当调试器将数组解释为C字符串时,它将显示字符,直到找到空字节并停止。碰巧在你的机器上 数组具有值 0x35 0x0 ; 我在这里通过添加 randomBytes 大堆这些值就是角色 5 和空字节,以便调试器打印 .

    那为什么呢 bb型 只打印6个字符?全局变量初始化为零,因此 bb型 对于 环循环后,这些空字节中的第7个用作EOS(字符串结束)标记,打印只显示预期的6个字符。

    最后,我为什么说以上结果是 放心?全局变量的内存布局顺序没有指定为C标准的一部分,C标准是Objective-C的基础,因此实际上不能保证 随机字节 数组紧跟在 字节数 大堆如果全局变量布局算法在您的计算机/编译器组合上不同,您可能不会得到相同的结果。然而,您问题的根本原因是相同的-打印正在从您的 字节数 大堆

    HTH公司