指针数组和大小混乱

时间:2010-08-03 13:47:02

标签: c++ pointers

为什么以下代码输出 4

char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";

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

5 个答案:

答案 0 :(得分:19)

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

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

**pointer是一个字母。 sizeof(**pointer)将为1.请注意,**指针是char,因为它被定义为char**。新的阵列的大小进入了这个。

请注意sizeof是编译器运算符。它在编译时呈现为常量。任何可以在运行时更改的内容(如新数组的大小)都无法使用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.

答案 1 :(得分:5)

sizeof总是返回一些字节。

这里,pointer是一个......错误的...指针,在32位架构上是32位,即4个字节。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

pointer的类型为char**,大小为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

答案 4 :(得分:2)

sizeof没有给出动态数组的大小(其大小仅在运行时确定,并且在不同的执行期间可能具有不同的大小)。

sizeof始终在编译时进行评估,它会为您提供相关类型的大小,在这种情况下类型为char** - 指针(到指针)。

您的任务是跟踪动态分配的数组的大小(您知道首先请求了多少)。由于它是一种负担,所以更有理由使用容器和字符串类,它们自己跟踪分配大小。