为什么以下代码输出4?
char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";
我有一个指针数组,但它的长度应该是1,不是吗?
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.
std::vector< >
, 它有一个 size
方法。 - MSalterssizeof
总是返回字节数。
在这里,pointer
是一个指针,在32位体系结构上为32位,即4个字节。
当您调用sizeof时,您要求以字节为单位的大小。指针实际上是表示您所指向的数据地址的整数,假设您使用的是x32操作系统,则int的大小为4个字节。
int
(尽管指针通常与 int 相同大小,因为两者通常都是 CPU 内部寄存器的大小)。 - James Curranpointer
是 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
sizeof
不能给出动态数组的大小(动态数组的大小在运行时确定,而且在不同的执行过程中可能有不同的大小)。
sizeof
总是在编译时计算,并且它给出了所询问类型的大小,在本例中该类型是char **
-指向指针的指针。
跟踪动态分配数组的大小是你的任务(你知道一开始请求了多少)。由于这是一个负担,更理由使用容器和字符串类,它们自己跟踪分配大小。
char**
?在 C++ 中,我们更喜欢使用类型std::vector<std::string>
。然后你可以简单地调用.size()
并获得所需的结果。 - fredoverflow