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
更宽以避免这种情况。但是,这通常不是问题,除非您处理的是非常大的数据集。