对于相同的值,C++大小不同的结果

C++ sizeof different result for the same value

本文关键字:结果 C++ 于相同      更新时间:2023-10-16

我想计算'sizeof'数组:

char* arr[] = { "abc", "def" };

当我在数组初始化后立即手动调用sizeof时,它工作正常。但是,如果我将数组传递给某个函数,它不会给出相同的结果。

int test(char* b[]) {
    return (int)sizeof(b);
}
int _tmain(int argc, _TCHAR* argv[])
{
    char* arr[] = { "abc", "def" };
    int p = test(arr); // gives 4
    int k = sizeof(arr); // gives 8
    ...
}

那么问题出在哪里呢?很抱歉新手问题,但我真的很想念它。

当你在_tmain中使用sizeofarr,你取的是数组本身的大小,这在你的架构上是2 * sizeof(char*) = 2 * 4 = 8的,因为你的char*占用32位= 4字节。

当您在test中使用sizeof b 时,您将采用指向数组第一个元素的指针的大小,该元素在您的体系结构中sizeof(char**) = 4。你采用指针大小而不是数组的原因是你不能将数组本身传递给函数 - 相反,你通过指向它们的第一个元素的指针传递它们。因此,有关数组实际大小的信息在调用中丢失。换句话说,你的函数test的签名等同于int test(char **b)

这是因为

当你在 C 或 C++ 中调用函数时,数组会衰减到指针。

在第一种情况下,编译器将arr视为数组;在第二种情况下,它看到的只是一个指向指针的指针。

在定义测试的地方,编译器看不到 b 指向什么。因此,sizeof 给出了指针的大小(实际上是指向指针的指针的大小)。

在 main 内部,它可以很好地看到实际大小是两个指针。

实际上没有将数组传递到函数中这样的事情 - 只传递指向数组的指针。[] 形式只是句法糖。

调用test时会丢失大小信息,因为数组衰减到指针。

您必须将数组的大小作为附加参数传递,或在参数类型中修复它。

欢迎来到C++。

您根本无法将数组传递给函数。在C++中,数组大部分时间都衰减到指针。您正在尝试传递一个数组,但实际上传递了一个指针,并且您的第二个sizeof计算为该指针的大小。

你不应该关心这些。数组是专用的低级数据结构,应仅用于实现更高级别的抽象。请改用std::vector