我想计算'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
...
}
那么问题是什么?抱歉新手问题,但我真的很想念它。
答案 0 :(得分:3)
当您在sizeof
的{{1}}上使用arr
时,您将获得数组本身的大小,即您的体系结构_tmain
,因为您2 * sizeof(char*) = 2 * 4 = 8
1}} s占用char*
位= 32
字节。
当您在4
sizeof
上b
使用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
。