指针数组和sizeof的困惑

9
为什么以下代码输出4
char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";

我有一个指针数组,但它的长度应该是1,不是吗?


1
你为什么认为你需要一个 char**?在 C++ 中,我们更喜欢使用类型 std::vector<std::string>。然后你可以简单地调用 .size() 并获得所需的结果。 - fredoverflow
5个回答

17

pointer是一个指针。在你的系统上,它的大小为4个字节。

*pointer也是一个指针。sizeof(*pointer)也将是4。

**pointer是一个字符。sizeof(**pointer)将会是1。请注意,**pointer是一个char,因为它被定义为char**。new的数组的大小不影响这个结果。

请注意,sizeof是一个编译器操作符。它在编译时转换为一个常量。任何在运行时可以更改的东西(比如new的数组的大小)都不能用sizeof确定。

注2:如果你定义成:

char* array[1];
char** pointer = array;

现在pointer的值基本上与之前相同,但现在您可以这样说:

 int  arraySize = sizeof(array); // size of total space of array 
 int  arrayLen = sizeof(array)/sizeof(array[0]); // number of element == 1 here.

如何在运行时确定数组的大小?只能通过跟踪我创建它时的长度来确定吗? - a1337q
1
基本上,就是这样。你必须记住你 new 出来的对象的大小。请注意,运行时库还必须将该信息存储在某个地方(以便知道要运行多少个析构函数),但并不可访问。 - James Curran
3
可以使用 std::vector< > , 它有一个 size 方法。 - MSalters

5

sizeof 总是返回字节数。

在这里,pointer 是一个指针,在32位体系结构上为32位,即4个字节。


只有在64位模式下编译时,才能在64位系统上使用8字节。 - Chris Huang-Leaver

3

当您调用sizeof时,您要求以字节为单位的大小。指针实际上是表示您所指向的数据地址的整数,假设您使用的是x32操作系统,则int的大小为4个字节。


1
实际上,指针就是一个指针。它通常对应于机器字,但我不会称其为int,那是混淆概念。 - falstro
1
@a1337q; 在32位架构上,指针的大小(很可能)始终为4,但无论如何都不能使用它来确定数组的大小。 - falstro
它是一个整数,但不一定是 int(尽管指针通常与 int 相同大小,因为两者通常都是 CPU 内部寄存器的大小)。 - James Curran
@a1337q:不,你不需要除以4。 - Bill
指针在 C 语言设计之初并不是整数。只需看看 8086,其中指针是一对整数。 - MSalters
显示剩余3条评论

2

pointerchar** 类型,大小为 4

你可能需要的是 char * pointer [1]

但是要获取这种数组的长度,你需要使用以下代码

int len = sizeof(pointer)/sizeof(char*)

看看这个:

int * pArr = new int[5];
int Arr[5];

sizeof(pArr); //==4 for 32 bit arch
sizeof(Arr); //==20 for 32 bit arch
sizeof(Arr)/sizeof(int); //==5 for any arch

有没有想法如何获取“pArr”的大小? - DKK

2

sizeof不能给出动态数组的大小(动态数组的大小在运行时确定,而且在不同的执行过程中可能有不同的大小)。

sizeof总是在编译时计算,并且它给出了所询问类型的大小,在本例中该类型是char **-指向指针的指针。

跟踪动态分配数组的大小是你的任务(你知道一开始请求了多少)。由于这是一个负担,更理由使用容器和字符串类,它们自己跟踪分配大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接