在这个小例子中,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),这恰好是你的平台上的一个,因为它们的大小是相同的.
如果你需要函数中数组的大小,你应该将它作为参数传递给函数,或者使用一个容器来跟踪你的大小.