当我想知道数组的大小时,我会执行以下操作:
int array[30];
for(int i = 0; i < 30; i++)
array[i] = i+1; //Fill list
const int size = sizeof(array) / sizeof(array[0]);
但是当我在函数中将数组作为参数传递时,我将在函数中有一个指针。
int size( int array[] )
{
return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}
这显然不起作用。但是如何在不使用其他参数的情况下获取函数中该数组的大小?
答案 0 :(得分:5)
如何在不使用的情况下获取函数中该数组的大小 另一个参数大小?
你没有。数组的大小必须某处对编译器可见。否则,你能够传递的只是一个指向数组中第一个元素的指针。
但是,您可以使用template
作为大小,并使其更加神奇和无缝:
template <size_t N> int size (const int (&ary)[N])
{
assert (N == (sizeof(ary) / sizeof (ary[0])));
return N;
}
进一步模板化元素的类型,因此这适用于任何数组:
template <typename T, size_t N> int size (const T (&ary)[N])
{
assert (N == (sizeof(ary) / sizeof (ary[0])));
return N;
}
答案 1 :(得分:2)
这是使用函数模板获取数组大小的方法:
template <typename T, size_t N>
constexpr size_t size(const T (&)[N] ) // omit constexpr if no C++11 support
{
return N
}
然后
for(int i = 0; i < size(array); i++) { .... }
但您可以使用std::array
(或std::tr1::array
或boost::array
,如果您没有C ++ 11)并使用size()
方法来简化操作。
答案 2 :(得分:1)
在C中,函数参数中的数组表现得非常奇怪。坦率地说,我认为这里的语言设计非常糟糕。
void foo(int data[10]) {
int *p;
int a[10];
}
sizeof(p)
可能是4(或者8)。 sizeof(a)
将是40(或80)。
那么您认为sizeof(data)
会是什么?如果你猜到了40(或80),你就错了。相反,它的大小与sizeof(p)
相同。
如果C编译器在参数名称后面立即看到[
,它会将其删除并用指针替换它,data[10]
变为*data
。 (这与我们在其他地方使用数组得到的衰减行为不同,当一个参数,数组得到更大的处理时)。
事实上,尽管数组大小不同,但仍会编译以下内容:
int foo(int data[10]);
int main() {
int hugearray[1000];
foo(hugearray); // this compiles!
}
C编译器不以任何方式尊重数组参数的大小。我相信编译器应该对任何数组参数发出警告,并鼓励我们直接使用*
。我可能允许[]
,但肯定不是[10]
,因为它被编译器忽略了。
如果您希望C编译器遵守数组的大小,则应传递数组的地址。
int foo(int (*data)[10]);
int main() {
int smallarray[10];
foo(&smallarray); // OK
int hugearray[1000];
foo(&hugearray); // error, as desired
}
回到最初的问题,参数数组对它们的大小一无所知。
答案 3 :(得分:0)
在C中,您无法通过将数组起始地址传递给函数来找到数组的大小。
例如,您已进行了函数调用
size(array); // You are calling function by passing address of array beginning element
int size( int array[] ) // this is same as int size(int *array)
{
return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}
这里sizeof(array)
会给你指针的大小。这取决于架构。
如果你传递字符数组而不是int数组,如果字符数组是nulterminated那么你可以使用strlen()
。这是我们找到数组大小的唯一方法。
strlen()
计算直到nul发生,你可以使用这个技巧但是为你的数组分配一个元素的内存或用MAX_SIZE + 1声明你的数组。当你存储大小为n的数组元素然后存储一个array [n]中的已知值,同时查找针对该值的大小检查,如strlen()
检查Nul字符。
答案 4 :(得分:0)
使用宏
int findSize(int array[])
{
//This will not return size off array,it will just get starting address array and no information about boundaries
return sizeof(array) / sizeof(array[0]);
}
//But we can define a Macro for this
#define FIND_ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
int main()
{
int SampleArray[30];
printf("\nSize =%d ",sizeof(SampleArray) / sizeof(SampleArray[0]));
printf("\nSize from Function =%d ",findSize(SampleArray));
printf("\nSize from Macro =%d ",FIND_ARRAY_SIZE(SampleArray));
printf("\n");
return 0;
}