C++ sizeof()在主函数和另一个函数中对同一数组调用时返回不同的值

C++ sizeof()在主函数和另一个函数中对同一数组调用时返回不同的值,c++,arrays,sizeof,C++,Arrays,Sizeof,我需要在函数中使用传递数组“X”的长度。数组是在main函数中创建的。我从主功能打印出以下内容: std::cout << "\n" << sizeof(X); std::cout << "\n" << sizeof(X); std::cout当您将原始数组(例如声明为int arr[100];)作为参数传递给其他函数时,它是否会衰减为指针(其大小在64位处理器上通常为8) 所以你声明了你的数组 int arr[100]; 然后声明函数 vo

我需要在函数中使用传递数组“X”的长度。数组是在main函数中创建的。我从主功能打印出以下内容:

std::cout << "\n" << sizeof(X);
std::cout << "\n" << sizeof(X);
std::cout当您将原始数组(例如声明为
int arr[100];
)作为参数传递给其他函数时,它是否会衰减为指针(其大小在64位处理器上通常为8)

所以你声明了你的数组

int arr[100];
然后声明函数

void f(int arr[]);
这被理解为

void (int *arr);
在C++11中,您可以使用sodeclare

std::array<int,100> arr;
std::数组arr;
并最好传递对其的引用:

void f(std::array<int,100> &arr);
void f(标准::数组和arr);
(您可以通过值传递它,但在函数调用时会复制所有100个整数)

BTW,也考虑一下,花几个小时阅读一本好的C++编程书。< /P> < P>当你传递一个原始数组(例如,声明为代码> int ARR(100);< /C> >作为一个参数到其他函数时,它被分解成一个指针(其大小通常在64位处理器上为8)。 所以你声明了你的数组

int arr[100];
然后声明函数

void f(int arr[]);
这被理解为

void (int *arr);
在C++11中,您可以使用sodeclare

std::array<int,100> arr;
std::数组arr;
并最好传递对其的引用:

void f(std::array<int,100> &arr);
void f(标准::数组和arr);
(您可以通过值传递它,但在函数调用时会复制所有100个整数)


BTW,也要考虑,花几个小时阅读一本好的C++编程书。

< > <代码>主<代码>数组大小将是4×100=400,但是当你把数组的地址传递给另一个函数时,它现在是指向数组的指针,这意味着<代码> x <代码>的大小现在是被调用函数中指针的大小。p> 在
main
中,数组大小将为4*100=400,但当您将数组地址传递给另一个函数时,它现在是指向数组的指针,这意味着
X
的大小现在是被调用函数中指针的大小

C数组可以隐式地简化为指针,它们将被简化。要使
sizeof
正常工作,您需要执行以下操作:

template<size_t N>
void func(char (&arr)[N])
{
/* sizeof(arr) == N in this scope */
}
模板
无效函数(字符(&arr)[N])
{
/*sizeof(arr)==N在此范围内*/
}

或者您可以使用C++11
std::array

C数组可以隐式地简化为指针,并且它们将被删除。要使
sizeof
正常工作,您需要执行以下操作:

template<size_t N>
void func(char (&arr)[N])
{
/* sizeof(arr) == N in this scope */
}
模板
无效函数(字符(&arr)[N])
{
/*sizeof(arr)==N在此范围内*/
}


或者你可以使用C++11
std::array

“我在等400”为什么?@LuchianGrigore:真的吗?不清楚他为什么会期望这样?数组有100个浮点元素这是另一个更喜欢
std::vector
(甚至
std::array
)的原因。@LuchianGrigore:你弄糊涂了。他的数组没有400个元素,只有100个。这不是一系列的布尔或字符,而是一系列的浮动。“我期待着400”为什么?@LuchianGrigore:真的吗?不清楚他为什么会期望这样?数组有100个浮点元素这是另一个更喜欢
std::vector
(甚至
std::array
)的原因。@LuchianGrigore:你弄糊涂了。他的数组没有400个元素,只有100个。它不是布尔数组或字符数组,而是浮点数组。如果数组不是将长度传递给函数或使用std::array,有没有其他方法可以找到长度?没有,没有这种方法;但是,您可以传递某个对象(即某个
结构
的某个实例),该对象将承载数组的大小。也考虑使用是的,有一种方式。您可以通过引用传递数组,如Etherealone的回答中所示。如果数组不是将长度传递给函数或使用std::array,是否还有其他方法可以找到长度?不,没有这种方法;但是,您可以传递某个对象(即某个
结构
的某个实例),该对象将承载数组的大小。也考虑使用是的,有一种方式。您可以通过引用传递数组,如Etherealone的回答所示。它确实需要是引用。将参数声明为
char arr[N]
相当于将其声明为
char*arr
,从而丢失大小。如果不将内置数组包装到类中,则无法按值传递它们。@MikeSeymour测试了它,事实上你是对的。但如果它不是引用,它甚至不会编译。它确实需要是引用。将参数声明为
char arr[N]
相当于将其声明为
char*arr
,从而丢失大小。如果不将内置数组包装到类中,则无法按值传递它们。@MikeSeymour测试了它,事实上你是对的。但如果不是引用,它甚至不会编译。