我(我想)我知道如果在堆栈的编译时声明它,你只能检索一个数组的大小(使用sizeof),例如
int my_array[] = {1,2,3};
sizeof(my_array) == 3;
一旦开始使用指针,就会丢失此长度信息。
e.g。如果你将一个指向int的指针作为一个函数参数传递给一个函数,你就不能再以这种方式使用sizeof()
,它只会返回用于存储指针的字节数。
显然,知道你的阵列有多长是至关重要的。
那么在传递数组时我应该使用以下哪个选项?
传递指针和附带的长度参数
int my_func(int *my_array, size_t len_my_array)
创建我自己的矢量结构
struct vector {
int *my_array;
size_t len;
}
int my_func(struct vector *my_vector)
使用别人的矢量实现。 (C是否存在C的默认实现?)
我错过了另一种方法吗?
(我目前正在使用第一个选项,但它有点笨拙,我很想知道这是否被认为是糟糕的编程习惯)
答案 0 :(得分:6)
您错过的一种方法是在数组的末尾添加终止元素,类似'\0'
标记char*
的结尾。
这个并将数组的长度作为一个不同的参数传递是通常的方法。
答案 1 :(得分:4)
标准方法是利用第一种方法并传递指针和大小,特别是如果您希望其他人重用您的代码。
答案 2 :(得分:1)
在我看来,现代C(又名C99)中最简单的方法是使用数组符号
int my_func(size_t len, int my_array[len]);
这几乎和你一样,但是尺寸第一。按此顺序执行此操作的原因是,这可以很好地扩展到多维数组
int my_func(size_t n, size_t m, int my_array[n][m]);
然后您可以在函数内正确获取索引计算,而不会有任何其他困难。
您必须确保的唯一事项
答案 3 :(得分:0)
没有被广泛接受的答案,这意味着你可以依赖的唯一方法是第一种。特别是,除非你自己编写所有你的代码(即,永远不使用任何库),否则你几乎可以指望你自己定义的任何vector
结构都不同于任何其他人的事实。在代码库之间的“边界”使用,所以在任何情况下你都需要你的第一个方法。他们可能拥有自己内部使用的vector
类型。您可能拥有自己在内部使用的一个 - 但是在两者相互交谈的情况下,他们必须将该类型“解包”到其各自的组件中。
答案 4 :(得分:0)
它有点外出,但我刚刚阅读有关数组和指针的内容,您可以考虑使用sizeof来确定字节总数,然后除以数组包含的数据类型的大小(以字节为单位)你的阵列长度......