我有一个动态数组,其中包含方法push
,pop
并直接访问缓冲区。 直观地,我使该字段包含数组包含的元素数size_t
。现在我添加如insert
,delete
和indexOf
的方法。用于保存数据结构中元素数量的数据类型
然而,前两个期望的int
作为位置时,使用负索引,用于选择从背面元件和indexOf
或者返回所找到的位置,或-1来表示失败,导致:
struct array {
size_t num;
char *buf;
}
void array_push(char c) {...}
char array_pop() {...}
void array_insert(int pos, char c) {...}
void array_delete(int pos) {...}
int array_indexOf(char c) {...}
随着push
/pop
和array.buf
与array.num
for循环我仍然可以访问多达SIZE_MAX
元素。 insert
和delete
最多只能访问INT_MAX
元素,而indexOf
无法通过INT_MAX
返回位置。
你认为这个实现是否正确,或者你会如何改变它?
size_t
亲:你最多可以有SIZE_MAX
元素
禁忌:你只能以有限的方式
int
INT_MAX
部分
亲:接口是一致的与实施
禁忌:你不能以任何方式超过INT_MAX
元素,也int
为对象的大小unintuitively因为这是目的的size_t
我以'asprintf'为例,它返回一个字符串的长度(通常是'size_t'),因为错误时为'int'或'-1'。理论上,如果我在x86上使用'ptrdiff_t',那么在x86-16上size_t将是2字节,而'ptrdiff_t'是4字节,因此在x86上不必要地大,所以'PTRDIFF_MAX == INT_MAX' -64我还可以用'indexOf'等访问'INT_MAX'和'PTRDIFF_MAX'之间的部分,但'PTRDIFF_MAX'和'SIZE_MAX'之间的部分不会被覆盖。 – netcat 2014-11-25 15:28:05
x86-16的更正:它实际上是唯一一个因大尺寸而工作的人,因为'ptrdiff_t'可以索引每个可能的元素,并且也指示错误或从后面选择,尽管它可能会更慢 – netcat 2014-11-25 15:37:14
True ,不能保证'ptrdiff_t'的宽度足以防止指针减法溢出。事实上,为避免这种情况,有些实现会使'ptrdiff_t'比'size_t'更宽。然而,除非你处理一个非常大的数据集,否则这通常不是问题。 – downhillFromHere 2014-11-25 16:01:01