2

当我执行以下代码时:

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?它是独立于机器的吗?

4

7 回答 7

6

sizeof char ** 指针是否依赖于机器的架构

它不仅依赖于机器,还依赖于编译器。您始终可以依赖的唯一尺寸是sizeof(char) == 1.

于 2012-04-10T18:13:14.497 回答
5

在最初的问题中,您没有打电话给sizeof.
黄昏为你解决了这个问题。

产生的输出是:

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
于 2012-04-10T18:14:20.743 回答
2

如果您在 64 位机器上运行 MS Visual Studio,您可以将解决方案平台从 win32 更改为 x64,以使用此代码查看指针的大小从 4 字节增长到 8 字节。

于 2013-08-15T21:08:18.233 回答
1

指针的大小取决于机器。

我不明白的是 char 指针的大小如何为 8

在您的系统上,一个 char 指针,即一个char*变量的大小确实为 8。在你的代码sizeof(*temp)中给出了一个 char 指针的大小,它是 8。原因sizeof(**temp)是 1 就是它,**temp并且char根据sizeof(char)定义是 1。

于 2012-04-10T18:26:37.220 回答
1

sizeof 运算符由编译器在编译时解析。在运行时不会发生实际的尊重。运算符的大小返回的是类型的大小。所以

sizeof(*(char *)0) is 1

如果目标平台有 64 位指针,则 sizeof(temp) 将为 8。如果目标平台有 128 位指针,则 sizeof(temp) 将为 16。

“目标”并不意味着它是您编译的平台,因为您可以交叉编译。

于 2012-04-10T20:24:29.093 回答
1

指针的大小取决于您的机器(检查您的机器类型)。如果您的机器是 64 位,则指针大小为 8 个字节,而 32 位机器指针大小为 4 个字节。

无论指针变量指向的指针的类型如何,指针大小都是相同的。指针类型对指针运算更有用,使用 sizeof 运算符时不要与它的大小混淆

于 2014-03-18T05:09:48.590 回答
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
于 2013-06-09T16:01:03.843 回答