为什么以下代码输出 4 ?
char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";
我有一个指针数组,但它的长度应为1,不应该吗?
答案 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**
- 指针(到指针)。
您的任务是跟踪动态分配的数组的大小(您知道首先请求了多少)。由于它是一种负担,所以更有理由使用容器和字符串类,它们自己跟踪分配大小。