查找int []数组的大小

问题描述 投票:4回答:8

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

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

}

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

请帮我找到这个。

c++
8个回答
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]将包含数组的大小。


3
投票

在函数声明中,qazxsw poi是一个指针:

array

在你的系统int fnLenghthOfArray(int arry[]) ^ is same as int* array


2
投票

你的功能声明

sizeof(int*) == sizeof(int)

相当于

int fnLenghthOfArray(int arry[]);

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

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

int fnLenghthOfArray(int* arry);

或者,您可以使用其中一个C ++容器,如int fnLenghthOfArray(int arry[], std::size_t size); vector


1
投票
array

相当于

int arry[]

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

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


1
投票
int *arry

此函数返回1,因为正在执行指针大小和整数大小之间的除法。在大多数体系结构中,指针的大小等于整数的大小。例如,在int fnLenghthOfArray(int arry[]){ return sizeof(arry)/sizeof(int); // This always returns 1 } 架构中,两者都有4个字节的大小。

其中,sizeof(array)/ sizeof(int)给出数组的实际长度,在声明它的函数中

因为在这种情况下编译器知道x86是一个数组及其大小。然而,在前一个函数中,编译器仅将arry知道为指针。事实上,当你指定函数原型时,arryint arry[]之间没有区别。


0
投票

您无法在int * arryC中获得数组大小。

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


0
投票

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

C++

-2
投票
#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];       
}

使用:

#include<iostream>

int main()
{
    int array[300];

    int d = sizeof(array)/4;
    std::cout<<d;   
} 
© www.soinside.com 2019 - 2024. All rights reserved.