-7

我对此有点困惑。在我的系统上,如果我这样做:

printf("%d", sizeof(int*));

这只会产生 4。现在,同样的情况发生在sizeof(int). 结论:如果整数和指针都是 4 个字节,则可以安全地将指针“转换”为 int(即它指向的内存可以存储在 int 中)。但是,如果我这样做:

int* x;
printf("%p", x);

返回的十六进制地址远远超出了 int 范围,因此任何将值存储在 int 中的尝试显然都会失败。

这怎么可能?如果指针占用 4 个字节的内存,它怎么能存储超过 2 32

编辑:正如一些用户所建议的,我发布了代码和输出:

#include <stdio.h>

int main()
{
    printf ("%d\n", sizeof(int));
    printf ("%d\n", sizeof(int*));

    int *x;
    printf ("%d\n", sizeof(x));
    printf ("%p\n", x);
}

输出:

4
4
4
0xb7778000
4

3 回答 3

3

C11,6.3.2.3,第 5 和第 6 段:

整数可以转换为任何指针类型。除非前面指定,结果是实现定义的,可能没有正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

任何指针类型都可以转换为整数类型。除非前面指定,结果是实现定义的。如果结果不能以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

因此允许转换,但结果是实现定义的(如果结果不能以整数类型存储,则为未定义)。(“先前指定的”指的是 NULL。)

关于打印大于 4 字节数据可以表示的指针的打印语句,这是不正确的,因为0xb7778000在 32 位整数类型的范围内。

于 2013-07-16T21:04:48.197 回答
2

返回的十六进制地址远远超出了 int 范围,因此任何将值存储在 int 中的尝试显然都会失败。

4
4
4
0xb7778000

And0xb7778000是一个32位值,因此4字节对象可以保存它。

于 2013-07-16T21:11:09.910 回答
1

不,它们不能“安全”转换。当然,它们使用相同数量的存储空间,但不能保证它们以相同的方式解释多个设置位。

至于第二个问题(请每个问题一个问题),int 或指针的大小没有保证。int 大致是总线上数据传输的最佳大小(也称为字)。它可以在不同的平台上有所不同,但必须相对(等于或)大于 short 或 char。这就是为什么有 MAX_INT 的标准定义,但没有定义的标准“值”。

指针大致是访问内存位置所需的位数。旧的原始 PC 有一个 8 位总线,但一个 12 位指针(由于一些花哨的位移)将其内存范围扩展到超过其总线大小。

于 2013-07-16T20:48:13.390 回答