假设我正在编写一个函数,该函数将float a[]
和偏移量放入此数组中,并返回该偏移量处的元素。使用签名
float foo(float* a, off_t offset);
为了它?或off_t
仅与字节中的偏移相关,而不是与aribtrary元素大小的指针算法?即当偏移量为a[offset]
时,说off_t
是否合理?
GNU C Library Reference Manual说:
off_t
This is a signed integer type used to represent file sizes.
但这并不能说明我的意思。
我的直觉是答案是“否”,因为[offset]中使用的实际地址是+ sizeof(float)* offset的地址,所以“sizeof(float)* offset”是{{ 1}}和sizeof(float)是off_t
,两者都是带'尺寸'的常量。
注意:偏移可能是负数。
答案 0 :(得分:2)
您可以使用size_t
或ptrdiff_t
作为索引的类型(您的第二个参数更多是浮点数组中的索引而不是偏移量。)
您的使用是索引,而不是偏移量。请注意,标准offsetof宏被定义为返回字节偏移量!
在实践中,您甚至可以使用int
或unsigned
,除非您认为您的阵列可能包含数十亿个组件。
您可能希望#include <stdint.h>
(或<cstdint>
使用最新的C ++),并为索引显式调整类型int32_t
。
出于源可读性的原因,您可以定义
typedef unsigned index_t;
以后使用它,例如
float foo(float a[], index_t i);
我的意见是你应该使用int
作为索引的类型。 (但适当地处理越界索引)。
答案 1 :(得分:2)
你有没有什么理由不使用int
?就是这样
C ++中的整数值的默认类型,应该使用
除非有充分理由不这样做。
当然,一个很好的理由可能是它可能会溢出。如果
上下文是这样的,你最终可能会非常大
数组,你可能想要使用ptrdiff_t
,它被定义(in
C和C ++)作为由两个减法产生的类型
指针:换句话说,它保证不会溢出(当
用作尺寸大于1的所有类型的偏移量。
答案 2 :(得分:1)
我认为这是不合适的,因为
off_t
(用于表示文件大小)off_t
是签名类型。我会选择size_type
(通常是size_t
的“typedef”名称),这是std容器使用的名称。
答案 3 :(得分:0)
也许答案是使用ptrdiff_t
?它...
您怎么看?