当我执行以下代码时:
int main()
{
char **temp;
printf("Size of **temp %d", sizeof(**temp));
printf("Size of *temp %d", sizeof(*temp));
printf("Size of temp %d", sizeof(temp));
return 0;
}
我明白了:
Size of **temp 1
Size of *temp 8
Size of temp 8
我不明白的是char
指针的大小是8
?机器无关吗?
答案 0 :(得分:7)
sizeof char **指针是否依赖于机器的体系结构
不仅取决于机器,它依赖于编译器。您始终可以依赖的唯一尺寸是sizeof(char) == 1
。
答案 1 :(得分:5)
在原始问题中,您没有给sizeof
打电话。
duskwuff为您解决了这个问题。
产生的输出是:
Size of **temp 1
Size of *temp 8
Size of temp 8
<强>原因:强>
在64位架构上,指针是8字节(无论它们指向什么)
**temp is of type char ==> 1 byte
*temp is of type pointer-to-char ==> 8 bytes
temp is of type pointer-to-pointer-to-char ==> 8 bytes
答案 2 :(得分:2)
如果您在64位计算机上运行MS Visual Studio,则可以将解决方案平台从win32更改为x64,以使用此代码查看指针大小从4字节增加到8字节。
答案 3 :(得分:1)
指针的大小取决于机器。
我不明白的是char指针的大小是8
在您的系统上,char指针(即char*
变量的大小为8)。在您的代码sizeof(*temp)
中给出了char指针的大小,它是8. sizeof(**temp)
为1的原因是**temp
是char
而sizeof(char)
是1根据定义。
答案 4 :(得分:1)
sizeof运算符由编译器在COMPILE TIME解析。在运行时不会发生实际的差异。运算符大小的返回值是类型的大小。所以
sizeof(*(char *)0) is 1
如果目标平台有64位指针,则sizeof(temp)将为8。 如果目标平台有128位指针,则sizeof(temp)将为16.
“target”并不意味着它是您编译的平台,因为您可以交叉编译。
答案 5 :(得分:1)
指针的大小取决于您的机器(检查您的机器 如果您的机器是64位,那么指针大小是8字节和 32位机器指针大小为4个字节。
无论指针的类型如何,指针大小都是相同的 指针变量指向。指针类型对指针更有用 算术,使用sizeof运算符时不要与它的大小混淆
答案 6 :(得分:0)
Size of **temp 1
Size of *temp 8
Size of temp 8
它显示了正确的答案。为什么呢?
Because
Size of **temp 1--->> pointing to char.
Size of *temp 8----->>pointing pointer to char.
Size of temp 8---->>>>pointing pointer to pointer to char.
并且您使用的是64位编译器,如果您将在32位编译器上运行此代码,它将为您提供
Size of **temp 1
Size of *temp 4
Size of temp 4