查找int []数组的大小

时间:2013-07-29 09:51:41

标签: c++

在以下函数中,我们如何找到数组的长度

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]){

}

我们可以得到大小。但在这里我不允许更改功能原型。

请帮我找到这个。

8 个答案:

答案 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 ++容器,例如vectorarray

答案 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)

您无法在CC++中获得数组大小。

这种语言的数组只是指向第一个元素的指针。你需要自己保持数组的大小。

答案 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.