C ++ sizeof对于相同的值有不同的结果

时间:2012-04-08 15:18:52

标签: c++ visual-studio-2010

我想计算'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
    ...
}

那么问题是什么?抱歉新手问题,但我真的很想念它。

5 个答案:

答案 0 :(得分:3)

当您在sizeof的{​​{1}}上使用arr时,您将获得数组本身的大小,即您的体系结构_tmain,因为您2 * sizeof(char*) = 2 * 4 = 8 1}} s占用char*位= 32字节。

当您在4 sizeofb使用test时,您将获得指向数组第一个元素的指针大小,即sizeof(char**) = 4建筑。您获取指针大小而不是数组的原因是您无法将数组传递给函数 - 而是通过指向其第一个元素的指针传递它们。因此,在调用中丢失了有关阵列实际大小的信息。换句话说,函数test的签名等同于int test(char **b)

答案 1 :(得分:2)

这是因为当您使用C或C ++调用函数时,arrays decay to pointers

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

答案 2 :(得分:0)

在定义测试的位置,编译器无法看到b指向的内容。因此,sizeof给出了指针的大小(实际上是指向指针的大小)。

在主要内部,它可以很好地看到实际尺寸是两个指针。

确实没有将数组传递给函数的东西 - 只传递指向数组的指针。 []形式只是语法糖。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

欢迎使用C ++。

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

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