c ++中的静态数组会忘记它的大小

Kar*_*lek 1 c++

在这个小例子中,c ++忘记了数组的大小,传递给构造函数.我想这很简单,但我看不到它.

在classes.h中,有以下代码:

#ifndef CLASSES_INC
#define CLASSES_INC
#include <iostream>

class static_class {
 public:
 static_class(int array[]) {
  std::cout<<sizeof(array)/sizeof(int)<<"\n";
 } 
};

class my_class{
 public:
 static static_class s;
 static int array[4];
};

#endif
Run Code Online (Sandbox Code Playgroud)

在classes.cpp中,有以下代码:

#include "classes.h"

int my_class::array[4]={1, 2, 3, 4}; 

static_class my_class::s = static_class(my_class::array);
Run Code Online (Sandbox Code Playgroud)

在main.cpp中,只有简单

#include "classes.h"

int main () {

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,所需的输出(来自static_class的构造函数)是4.但我得到的是1.为什么?

编辑:

很多答案都表明指针上的sizeof返回指针的大小.事实并非如此,AFAIK(来自http://msdn.microsoft.com/en-us/library/4s7x1k91(VS.71).aspx - "当sizeof运算符应用于数组时,它会产生总数该数组中的字节数,而不是数组标识符表示的指针的大小.")

EDIT2:

好吧,正如我发现的那样,当编译器可以看到大小时,sizeof会返回整个大小,但是当它衰减到一个指针(这就是这里的情况)时,sizeof实际上实际上返回了指针的大小.

Jam*_*lis 11

声明函数参数时,以下两个是等效的,因为当数组作为参数传递时,数组会衰减为指针:

int array[]
int *array;
Run Code Online (Sandbox Code Playgroud)

所以,你最终计算sizeof(int*) / sizeof(int),这恰好是你的平台上的一个,因为它们的大小是相同的.

如果你需要函数中数组的大小,你应该将它作为参数传递给函数,或者使用一个容器来跟踪你的大小.