使用sizeof正确使用Byte []

时间:2011-08-30 19:58:31

标签: objective-c

我有点不在这里,但我有以下代码(真正的代码实际上有一点当然):

- (NSData*) dataTheseBytes:(Byte[]) bytes {
     return [NSData dataWithBytes:bytes length:sizeof(bytes)];
}

编译器警告是

  

数组函数参数的sizeof将返回'Byte *'的大小(又名   'unsigned char *')而不是'Byte []'

如何消除此警告(或者更确切地说,我不了解我的字节数组?)

此外,为什么这段代码不会发生错误?必须与方法签名有关...?

    Byte bytes[3] = { byte1, byte2, byte3 };
    NSData *retVal = [NSData dataWithBytes:bytes length:sizeof(bytes)];

3 个答案:

答案 0 :(得分:5)

当您将C数组作为方法或C函数参数传递时,它会“衰减”为指向基础类型的指针(即Byte[]实际上是作为Byte *传递的。)所以被调用的方法/ function不知道数组中有多少个元素。

您还必须传递数组的长度,以便被调用的代码知道您想要的内容。这就是+[NSData dataWithBytes:length:]有第二个论点的原因。

答案 1 :(得分:2)

c数组不会嵌入其元素数。

这是如何使用未指定的元素计数声明方法。这通常不可用:

`- (NSData*) dataTheseBytes:(const Byte*)bytes;`
// or
`- (NSData*) dataTheseBytes:(const Byte[])bytes;`

更严格的实现可以指定元素计数。如果你总是使用相同的尺寸,这是可以的。例如:

enum { MONByteBufferElementCount = 23 };
...
`- (NSData*) dataTheseBytes:(const Byte[MONByteBufferElementCount])bytes
{
  return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}

在这种情况下使用objc消息传递的问题是,如果已声明具有相同名称但使用不同参数或元素计数的选择器,则编译器可能无法确定适当的选择器并产生错误或警告。因此,使用c函数更安全:

`NSData* DataTheseBytes(const Byte bytes[MONByteBufferElementCount]) {
  return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}

或使用更详细的名称:

`- (NSData*) dataWithMONByteBuffer:(const Byte[MONByteBufferElementCount])bytes
{
  return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}

在objc中,最常将长度作为参数传递,类似于您调用的NSData构造函数。程序的某些部分将能够确定此值(无论是NSData,c数组还是其他内容。)

- (NSData*) dataTheseBytes:(const Byte*)bytes length:(NSUInteger)length
{
  return [NSData dataWithBytes:bytes length:length];
}

通常会看到元素计数,如下所示:

- (NSData*) dataTheseFloats:(const float*)floats length:(NSUInteger)count
{
  return [NSData dataWithBytes:floats length:count * sizeof(float)];
}

最后,当然有一些极端情况。显而易见的是一个以空字符结尾的字符串:

- (NSData*) dataWithASCIIString:(const char*)chars
{
  return [NSData dataWithBytes:chars length:strlen(chars)];
}

答案 2 :(得分:0)

您无法将数组传递给函数。您正在将指针传递给调用者数组中的第一个元素。

如果您需要该数组的长度,则需要将该长度作为单独的参数传递给您的函数,并使用该长度代替sizeof