1

当我想知道数组的大小时,我执行以下操作:

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
}

这显然是行不通的。但是如何在函数中获取该数组的大小而不使用另一个参数作为大小呢?

4

5 回答 5

5

如何在函数中获取该数组的大小而不使用另一个参数作为大小?

你没有。数组的大小必须在编译器可见的地方。否则,您将能够传递的只是指向数组中第一个元素的指针。

但是,您可以使用 atemplate作为尺寸,并使其更加神奇和无缝:

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;
}
于 2013-10-23T15:47:19.937 回答
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::arraystd::tr1::array或者boost::array如果您没有 C++11)并使用它的size()方法来简化事情。

于 2013-10-23T15:42:54.763 回答
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 编译器[在参数名称后立即看到 a ,它将删除它并用指针替换它,然后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
}

回到最初的问题,参数数组对它们的大小一无所知。

于 2013-10-23T16:06:28.940 回答
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;

}
于 2013-10-23T16:14:28.680 回答
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 数组,并且如果字符数组被取消,那么你可以使用strlen()。这是我们找到数组大小的唯一方法。

strlen()计数直到 nul 出现,你可以使用这个技巧但是为你的数组再分配一个元素的内存或用 MAX_SIZE+1 声明你的数组。如果你存储大小为 n 的数组元素,然后在 array[n] 中存储一个已知值和同时针对该值查找大小检查,例如strlen()检查 Nul 字符。

于 2013-10-23T15:44:44.247 回答