4

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

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

}

我们可以得到尺寸。但是这里我不允许更改函数原型。

请帮我找到这个。

4

8 回答 8

14

请记住,在 C 中,当您将数组作为参数传递给函数时,您传递的是指向该数组的指针。如果要传递数组的大小,则应将其作为单独的参数传递。

指针和 an 的大小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]将包含数组的大小。

于 2013-07-29T09:57:27.470 回答
3

In function decalration, array is a pointer:

int fnLenghthOfArray(int arry[])
                        ^
                          is same as int* array 

And in your system sizeof(int*) == sizeof(int).

于 2013-07-29T09:53:31.047 回答
2

你函数声明

int fnLenghthOfArray(int arry[]);

相当于

int fnLenghthOfArray(int* arry);

因此您的计算得出 1(基于指向 int 的指针的大小和 int 的大小相同的假设)。

获取数组大小的唯一选择是提供一个附加参数

int fnLenghthOfArray(int arry[], std::size_t size);

或者,您可以使用其中一个 C++ 容器,例如vectorarray

于 2013-07-29T09:57:35.650 回答
1
int arry[]

相当于

int *arry

并且sizeof()运算符在应用于arry时返回 4,因为它是指针的大小(或在 arry[] 的情况下为引用),int 的大小也是 4 个字节,这就是它总是返回 1 的原因。

要解决您的问题,您必须以不同的方式实现数组。也许第一个元素应该始终具有数组的大小。否则,您可以使用STL 或list 中的向量类。

于 2013-07-29T09:57:26.707 回答
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

于 2013-07-29T09:54:36.880 回答
0

You can't get size of array in C or C++.

Array in this languages is simply pointer to first element. You need to keep size of array by yourself.

于 2013-07-29T09:57:03.073 回答
0

这是使用 Maroun 技巧的代码片段。

#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];       
}
于 2018-01-04T12:21:39.973 回答
-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.
于 2017-06-12T19:19:46.327 回答