C++ 数组和指针的 sizeof 结果
Result of sizeof for C++ arrays and pointers
在x86_64 体系结构中,指针为 8 个字节。我觉得 sizeof(x)
应该 return 8. 我理解 char
是一个字节,5 个字节是数组 z
的大小。为什么 sizeof(z)
不是 return 8 背后的直觉是什么?
int* x = new int[10];
char z[5];
// Returns 8
std::cout << "This is the size of x: " << sizeof(x) << std::endl;
// Returns 5
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
What is the intuition behind why sizeof(z)
does not return 8?
z
不是指针。因此 sizeof(z)
不是什么,而是 5 个字节。在 sizeof
的情况下,数组不会衰减为指针。参考:What is array decaying?
C++ 中有几种隐式转换,如数组到指针、枚举到整数、double
到 float
、派生到基数、任何指针到 void*
等等。这可能会让我们思考它们的尺寸是否相同或什么?
因此,自我理解的试金石是创建指针引用并尝试分配其他类型。对于不匹配的类型,它会导致错误。例如
int *x = new int[5], *&px = x; // OK
int z[5], *&pz = z; // error: can't initialize
每个字符的大小都是'1'
假设当你编译它时
//It returns 1
char z='a';
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
//It returns 5 because it is an array of 5 characters
char z[5];
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
您已将 x
定义为指向 char 的指针,因此 sizeof(x)
产生指向 char 的指针的大小。在当前的实现中,通常是 32 位或 64 位。 char
通常是 8 位,因此您可以期望 sizeof(char *)
在大多数当前编译器上产生 4 或 8。
您已将 z
定义为 5 个字符的数组,因此 sizeof(z)
生成 5 个字符的数组的大小。由于数组的元素是连续的,并且 sizeof(char)
保证为 1,因此显而易见的值为 5。
如果(例如)将 5 个字符的数组放入结构中,然后是(比如)int
,编译器很有可能会在这两个元素之间插入一些填充.
当你传递一个数组名给sizeof时,你想知道有多少"bytes"数据属于这个数组。
当你传递一个指针给sizeof时,你想知道这个指针占用了多少"bytes"
将数组名作为函数参数传递时,差异非常明显。在这种情况下,函数无法看到数组占用的整个数据区域。它只看到 "pointer" 类型。
在x86_64 体系结构中,指针为 8 个字节。我觉得 sizeof(x)
应该 return 8. 我理解 char
是一个字节,5 个字节是数组 z
的大小。为什么 sizeof(z)
不是 return 8 背后的直觉是什么?
int* x = new int[10];
char z[5];
// Returns 8
std::cout << "This is the size of x: " << sizeof(x) << std::endl;
// Returns 5
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
What is the intuition behind why
sizeof(z)
does not return 8?
z
不是指针。因此 sizeof(z)
不是什么,而是 5 个字节。在 sizeof
的情况下,数组不会衰减为指针。参考:What is array decaying?
C++ 中有几种隐式转换,如数组到指针、枚举到整数、double
到 float
、派生到基数、任何指针到 void*
等等。这可能会让我们思考它们的尺寸是否相同或什么?
因此,自我理解的试金石是创建指针引用并尝试分配其他类型。对于不匹配的类型,它会导致错误。例如
int *x = new int[5], *&px = x; // OK
int z[5], *&pz = z; // error: can't initialize
每个字符的大小都是'1' 假设当你编译它时
//It returns 1
char z='a';
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
//It returns 5 because it is an array of 5 characters
char z[5];
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
您已将 x
定义为指向 char 的指针,因此 sizeof(x)
产生指向 char 的指针的大小。在当前的实现中,通常是 32 位或 64 位。 char
通常是 8 位,因此您可以期望 sizeof(char *)
在大多数当前编译器上产生 4 或 8。
您已将 z
定义为 5 个字符的数组,因此 sizeof(z)
生成 5 个字符的数组的大小。由于数组的元素是连续的,并且 sizeof(char)
保证为 1,因此显而易见的值为 5。
如果(例如)将 5 个字符的数组放入结构中,然后是(比如)int
,编译器很有可能会在这两个元素之间插入一些填充.
当你传递一个数组名给sizeof时,你想知道有多少"bytes"数据属于这个数组。
当你传递一个指针给sizeof时,你想知道这个指针占用了多少"bytes"
将数组名作为函数参数传递时,差异非常明显。在这种情况下,函数无法看到数组占用的整个数据区域。它只看到 "pointer" 类型。