【发布时间】:2011-09-13 15:45:32
【问题描述】:
我有一个关于使用intptr_t 与long int 的问题。我观察到递增内存地址(例如通过手动指针算法)因数据类型而异。例如,增加一个 char 指针会将 1 添加到内存地址,而增加一个 int 指针会增加 4、8 用于双精度,16 用于长双精度等...
起初我做了这样的事情:
char myChar, *pChar;
float myFloat, *pFloat;
pChar = &myChar;
pFloat = &myFloat;
printf( "pChar: %d\n", ( int )pChar );
printf( "pFloat: %d\n", ( int )pFloat );
pChar++;
pFloat++;
printf( "and then after incrementing,:\n\n" );
printf( "pChar: %d\n", (int)pChar );
printf( "pFloat: %d\n", (int)pFloat );
编译和执行都很好,但是 XCode 给了我关于类型转换的警告:“从指针转换为不同大小的整数。”
经过一番谷歌搜索(后者是一个词吗?),我看到有人推荐使用intptr_t:
#include <stdint.h>
...
printf( "pChar: %ld\n", ( intptr_t )pChar );
printf( "pFloat: %ld\n", ( intptr_t )pFloat );
这确实解决了错误。所以,我想,从现在开始,我应该使用intptr_t 来进行类型转换指针...但是经过一番折腾,我发现我可以通过将int 替换为long int 来解决问题:
printf( "pChar: %ld\n", ( long int )pChar );
printf( "pFloat: %ld\n", ( long int )pFloat );
所以我的问题是,为什么intptr_t 有用,什么时候应该使用它?在这种情况下,这似乎是多余的。显然,myChar 和 myFloat 的内存地址太大而无法放入 int... 所以将它们类型转换为 long ints 解决了这个问题。
是否有时内存地址对于long int 来说也太大了?现在我考虑了一下,我想如果你有 > 4GB 的 RAM,这是可能的,在这种情况下,内存地址可能超过 2^32 - 1(无符号长整数的最大值......)但 C 早在那之前就被创建了可以想象,对吧?还是他们有那么有先见之明?
谢谢!
【问题讨论】:
-
是的,binging 是一个词,最初的意思是沉迷于某项活动,尤其是饮食,过度。
-
将
intptr_t与 printf 函数一起使用是不可移植的,它没有格式说明符。将指针转换为 void 指针并使用%p格式说明符。
标签: c memory-management types casting intptr