Objective c 你能通过(目标)C中的指针解引用复制一个结构吗?

Objective c 你能通过(目标)C中的指针解引用复制一个结构吗?,objective-c,c,Objective C,C,根据Crashlytics的说法,这条线路引起了麻烦: // copy preamble data _preamble = * (ShowMetaHdrPreamble *) [data bytes]; _序言是一个ShowMetaHdreamble结构。数据不是零。我认为数据可能并不总是足够长,无法填充ShowMetaHdreamble—看起来这种情况没有经过测试 但我的问题是关于语法的,这不是我在C或Objective C中看到的复制结构的语法。我通常要么使用memcpy进行复制,要么通过

根据Crashlytics的说法,这条线路引起了麻烦:

// copy preamble data
_preamble = * (ShowMetaHdrPreamble *) [data bytes];
_序言是一个ShowMetaHdreamble结构。数据不是零。我认为数据可能并不总是足够长,无法填充ShowMetaHdreamble—看起来这种情况没有经过测试

但我的问题是关于语法的,这不是我在C或Objective C中看到的复制结构的语法。我通常要么使用memcpy进行复制,要么通过铸造和复制单个结构构件进行复制。这是格式化数据字节流并将其复制到结构中的有效方法吗

你知道为什么这条线有时会导致撞车吗,或者我已经回答过了


我很确定,在C语言的早期,你不能仅仅用“=”来复制结构,但我从ANSI C K&R中看到,现在这是合法的。

是的,你可以用=”来复制结构,是的,你应该在复制之前验证data.length>=sizeofShowMetaHdrPreamble。也就是说,是的,您回答了自己的问题:但是请注意,根据数据来源的不同,可能会出现endianess、Size和padding方面的问题。这个问题可以通过包含来自Crashlytics的确切错误消息来改进。Crashlytics报告EXC_BAD_ACCESS KERN_INVALID_ADDRESS位于0x0,在我看来,这就像读取了数据字节的结尾。实际上,它看起来像是在读取一个nil指针,但之前已经对它进行了显式测试,所以它不可能是这样。即使数据不是nil,如果data.length==0,那么[data bytes]也将是nil,因此可能只需要检查长度。另一个潜在问题是对齐。如果数据对象是从另一个数据对象的子范围创建的,则它可能未对齐,在这种情况下,分配方法可能会在某些体系结构上崩溃,尽管没有这些特定的崩溃详细信息,但这些细节确实指示空解引用。memcpy在这种情况下会起作用。