在 C 语言中声明数组类型是否是错误的编程习惯?
Is it bad programming practice to declare an array type in C?
我有一堆不同长度的数组,我想让长度接近数组,这样定义是不是不好的编程习惯?
typedef struct Array {
long len;
int* buf;
} Array;
这有什么明显的缺点或陷阱吗?
不,不一定。您将需要使用指针传递缓冲区的长度,以确保您不会超出它。由于额外的取消引用,这将对性能造成轻微影响,但如果始终具有可用长度可以避免导致错误,那么这可能是一个值得的权衡。您需要确保在调整缓冲区大小时更新长度,并确保在释放结构时释放缓冲区。除此之外,这对我来说很有意义,这也是许多其他 higher-level 语言在其数组实现中所做的。
这很好,类似的结构通常用于计数的字符串,也就是向量,它们不是空终止的,因此需要存储它们的长度。不过,如果数组仅在本地使用,我不会为这种方法烦恼。
如前所述,长度最好使用 size_t
或 uint32_t
等无符号类型。
在处理指针时,需要采取通常的预防措施以确保它在使用或传递之前始终具有有效引用,释放分配的内存等。使用 valgrind 强烈推荐。
我有一堆不同长度的数组,我想让长度接近数组,这样定义是不是不好的编程习惯?
typedef struct Array {
long len;
int* buf;
} Array;
这有什么明显的缺点或陷阱吗?
不,不一定。您将需要使用指针传递缓冲区的长度,以确保您不会超出它。由于额外的取消引用,这将对性能造成轻微影响,但如果始终具有可用长度可以避免导致错误,那么这可能是一个值得的权衡。您需要确保在调整缓冲区大小时更新长度,并确保在释放结构时释放缓冲区。除此之外,这对我来说很有意义,这也是许多其他 higher-level 语言在其数组实现中所做的。
这很好,类似的结构通常用于计数的字符串,也就是向量,它们不是空终止的,因此需要存储它们的长度。不过,如果数组仅在本地使用,我不会为这种方法烦恼。
如前所述,长度最好使用 size_t
或 uint32_t
等无符号类型。
在处理指针时,需要采取通常的预防措施以确保它在使用或传递之前始终具有有效引用,释放分配的内存等。使用 valgrind 强烈推荐。