c++ - 在 C++ 中使用 sizeof 的奇怪行为

标签 c++ sizeof

我是 C++ 的新手。从示例中,我发现使用 sizeof 来检索数组的长度

int main()
{
int newdens[10];
// the first line returns 10 which is correct
std::cout << "\nLength of array = " << (sizeof(v1)/sizeof(*v1)) << std::endl;
std::cout << "\nLength of array = " << (sizeof(v1) << std::endl; //returns 40
std::cout << "\nLength of array = " << (sizeof(*v1)) << std::endl; //returns 4
    }

但是如果我写一个这样的函数

#include <iostream>

void myCounter(int v1[])
    {
    int L, L2, L3;
    L = (sizeof(v1)/sizeof(*v1)); 
    L2 = (sizeof(v1)); 
    L3 = (sizeof(*v1)); 
    std::cout << "\nLength of array = " << L << std::endl;
    std::cout << "\nLength of array = " << L2 << std::endl;
    std::cout << "\nLength of array = " << L3 << std::endl;

    }

int main()
{
int v1[10];

std::cout << "\nLength of array = " << (sizeof(v1)/sizeof(*v1)) << std::endl;
std::cout << "\nLength of array = " << (sizeof(v1)) << std::endl;
std::cout << "\nLength of array = " << (sizeof(*v1)) << std::endl;

myCounter(v1);
    }

输出是L=2, L2 = 8, L3 = 4。我不明白问题出在哪里。

如何在函数中获取 v1 的正确长度?

最佳答案

这里的问题是 sizeof() 在编译时被解析。由于它没有关于您的阵列有多大的信息,因此无法判断其大小。它将它解释为一个指向 int 的指针,它在您的机器上是 64 位的。

最好的方法是使用 std::vector 而不是 C 风格的数组,并使用它的方法 size()

关于c++ - 在 C++ 中使用 sizeof 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389558/

相关文章:

c++ - Valgrind 在使用 Boost 线程时报告 'possibly lost' 内存

c++ - 带 ESP8266 的 PMS5003 - 许多校验和错误

c++ - 再现随机 std::set<T*> 顺序

c - 用指针声明的数组的大小

delphi - 对象的字节大小,包括成员的大小

c++ - 匹配 gmock 中的结构

c++ - PC 上的 C++ 和 Arduino 之间的 Sizeof() 区别

c - 为什么直接将值传递给 sizeof 运算符时,数据类型的大小会不同?

c# - 检索结构体的 [StructLayout] 属性

c++ - Google测试:错误LNK2019:带有CMake的Visual Studio 2017的未解析外部符号