C 用于保存数据结构中元素计数的数据类型
我有一个动态数组,包含方法C 用于保存数据结构中元素计数的数据类型,c,arrays,count,int,size-t,C,Arrays,Count,Int,Size T,我有一个动态数组,包含方法push、pop和直接访问缓冲区。 直观地说,我将包含数组包含的元素数的字段设置为大小\u t。现在我添加了insert、delete和indexOf等方法 但是,前两种情况下,intas位置使用负索引从后面选择元素,indexOf返回找到的位置或-1表示失败,导致: struct array { size_t num; char *buf; } void array_push(char c) {...} char array_pop() {...}
push
、pop
和直接访问缓冲区。
直观地说,我将包含数组包含的元素数的字段设置为大小\u t
。现在我添加了insert
、delete
和indexOf
等方法
但是,前两种情况下,int
as位置使用负索引从后面选择元素,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
和for循环array.buf
和array.num
我仍然可以访问最多SIZE\u MAX
元素<代码>插入和删除
最多只能访问INT\u MAX
元素,并且索引
无法返回INT\u MAX
上的位置
<>你会认为这个实现是正确的吗?或者你会如何改变它?
尺寸
pro:最多可以有SIZE\u MAX
元素
相反:您只能以有限的方式访问上面的部分INT\u MAX
int
赞成:接口将与实现保持一致
相反:在任何情况下,你最多只能有
INT\u MAX
个元素,而且INT
因为对象的大小是不直观的,因为这是size\u t
的目的在我看来,在你的情况下,对于函数参数和返回值,保留size\u t
并使用ptrdiff\u t
而不是int
更为自然。您可以在stddef.h
中找到它,顾名思义,它用于数组索引和地址算法
请注意,尽管
ptrdiff\u t
是两个指针相减的结果,但不能保证这样做时不会溢出。因此,在处理非常大的对象时,它可能会导致问题,在这种情况下,最好使用指定的宽度整数类型,例如,int\u fast64\u t
不要限制实现。向接口添加带有大小参数的方法
void array_insert_beg(size_t pos, char c) {...}
void array_insert_end(size_t pos, char c) {...}
...
bool array_find(char c, size_t *index) {...}
我以
asprintf
为例,它返回字符串的长度(通常也是size\u t
)作为int
或-1
的错误。理论上,如果我在x86上使用ptrdiff\u t
,没有任何区别,因为在x86-16上size\u t
将是2个字节,但ptrdiff\u t
4个字节,因此不必要的大,在x86-64上,我还可以使用indexOf
访问INT\u MAX
和PTRDIFF\u MAX
之间的部分,等等,但是PTRDIFF\u MAX
和SIZE\u MAX
之间的部分还不包括在内,由于ptrdiff_t
可以索引每个可能的元素,还可以指示错误或从后面选择,尽管它可能是慢的,但不能保证ptrdiff_t
的宽度足以防止指针减法溢出。事实上,一些实现使ptrdiff\u t
比size\u t
更宽以避免这种情况。但是,这通常不是问题,除非您处理的是非常大的数据集。