在以下函数中,我们如何找到数组的长度
int fnLenghthOfArray(int arry[]){
return sizeof(arry)/sizeof(int); // This always returns 1
}
此函数始终返回1。
其中,sizeof(arry)/sizeof(int)
给出数组的实际长度,在声明它的函数中。
如果我们使用矢量或模板
template<typename T,int N>
int fnLenghthOfArray(T (&arry)[N]){
}
我们可以得到大小。但在这里我不允许更改功能原型。
请帮我找到这个。
答案 0 :(得分:12)
请记住,在C中,当您将数组作为参数传递给函数时,您将指针传递给数组。如果要传递数组的大小,则应将其作为单独的参数传递。
指针和int
的大小为4或8或其他 - 取决于ABI
。
在您的情况下,它是4
,因此您获得的sizeof(int *)/sizeof int
为1。
这是一个有用的技巧
您可以将数组的长度存储在其第一个元素中:
int myArray[]= {-1, 1, 2, 3, 4, 5};
myArray[0] = sizeof(myArray) / sizeof(myArray[0]) - 1;
//The -1 because.. the first element is only to indicate the size
现在,myArray[0]
将包含数组的大小。
答案 1 :(得分:3)
在函数声明中,array
是一个指针:
int fnLenghthOfArray(int arry[])
^
is same as int* array
在您的系统中sizeof(int*) == sizeof(int)
。
答案 2 :(得分:2)
你的功能声明
int fnLenghthOfArray(int arry[]);
相当于
int fnLenghthOfArray(int* arry);
因此您的计算得出1(基于int指针的大小和int的大小相同的假设。)
获取数组大小的唯一选择是提供附加参数
int fnLenghthOfArray(int arry[], std::size_t size);
或者,您可以使用其中一个C ++容器,例如vector
或array
答案 3 :(得分:1)
int fnLenghthOfArray(int arry[]){
return sizeof(arry)/sizeof(int); // This always returns 1
}
此函数返回1,因为正在执行指针大小和整数大小之间的除法。在大多数体系结构中,指针的大小等于整数的大小。例如,在x86
体系结构中,两者都具有4个字节的大小。
其中,sizeof(arry)/ sizeof(int)给出了实际的长度 数组,在声明它的函数中
因为在这种情况下编译器知道arry
是一个数组及其大小。然而,在前一个函数中,编译器仅将arry
知道为指针。实际上,当您指定函数原型时,int arry[]
和int * arry
之间没有区别。
答案 4 :(得分:1)
int arry[]
相当于
int *arry
并且 sizeof()运算符在应用于 arry 时返回4,因为它是指针的大小(或者在arry []的情况下为引用),大小int也是4个字节,这就是它总是返回1的原因。
要解决您的问题,您必须以不同的方式实现数组。也许第一个元素应该总是具有数组的大小。否则,您可以使用STL中的 vector 类或 list 。
答案 5 :(得分:0)
您无法在C
或C++
中获得数组大小。
这种语言的数组只是指向第一个元素的指针。你需要自己保持数组的大小。
答案 6 :(得分:0)
以下是使用Maroun's技巧的代码段。
#include<stdio.h>
void print_array(int *array);
void shift_array_normal(int *array,int arrayLen);
int main(void)
{
int array[]= {-1,32,44,185,28,256,22,50};
array[0] = sizeof(array) / sizeof(array[0]) - 1;
print_array(array);
return 0;
}
void print_array(int *array){
int index,arrayLen = array[0];
//length of array is stored in arrayLen now we can convert array back.
printf("Length of array is : %d\n",arrayLen);
//convert array back to normal.
shift_array_normal(array,arrayLen);
//print int array .
for(index = 0; index < arrayLen; index++)
printf("array[%d] = %d\n",index,array[index]);
}
/*removing length element from array and converting it back to normal array*/
void shift_array_normal(int *array,int arrayLen){
int index;
for(index = 0; index < arrayLen; index++)
array[index] = array[index + 1];
}
答案 7 :(得分:-2)
#include<iostream>
int main()
{
int array[300];
int d = sizeof(array)/4;
std::cout<<d;
}
使用:
// sizeof(array)/4 for "int" array reserves 4 bits.
// sizeof(array)/4 for "float" array reserves 4 bits.
// sizeof(array) for "char" array reserves 2 bits.
// sizeof(array) for "bool" array reserves 2 bits.
// sizeof(array)/8 for "double" array reserves 8 bits.
// sizeof(array)/16 for "long double" array reserves 16 bits.