1

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

所以有什么问题?对不起新手的问题,但我真的很想念它。

4

5 回答 5

3

当您使用sizeofon arrin 时_tmain,您将获取数组本身的大小,这2 * sizeof(char*) = 2 * 4 = 8在您的体系结构中,因为您char*的 s 占用32位 =4字节。

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

于 2012-04-08T15:23:53.730 回答
2

这是因为当您在 C 或 C++ 中调用函数时,数组会衰减为指针

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

于 2012-04-08T15:23:19.093 回答
0

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

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

确实没有将数组传递给函数这样的事情——只传递指向数组的指针。[] 形式只是语法糖。

于 2012-04-08T15:23:31.187 回答
0

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

您必须将数组的大小作为附加参数传递,或者将其固定在参数类型中。

于 2012-04-08T15:23:36.747 回答
0

欢迎使用 C++。

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

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

于 2012-04-08T15:31:26.087 回答