为什么/何时使用 `intptr_t` 在 C 中进行类型转换?

2023-12-06

我有一个关于使用的问题intptr_t vs. long int。我观察到递增内存地址(例如通过手动指针算术)因数据类型而异。例如,递增 char 指针会向内存地址添加 1,而递增 int 指针会添加 4、8(对于 double)、16(对于 long double)等等……

起初我做了这样的事情:

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 with long int:

printf( "pChar:  %ld\n", ( long int )pChar );
printf( "pFloat: %ld\n", ( long int )pFloat );

所以我的问题是,为什么intptr_t有用,什么时候应该使用?在这种情况下,这似乎是多余的。显然,内存地址为myChar and myFloat太大了,装不下int...所以将它们类型转换为long int解决了问题。

Is it that sometimes memory addresses are too big for long int as well? Now that I think about it, I guess that's possible if you have > 4GB of RAM, in which case memory addresses could exceed 232 - 1 (max value for unsigned long ints...) but C was created long before that was imaginable, right? Or were they that prescient?

Thanks!


intptr_t是一个新的发明,是在想象出64位甚至128位内存地址之后创建的。

If you ever需要将指针转换为整数类型,always use intptr_t。做任何其他事情都会给将来需要移植你的代码的人带来不必要的问题。

当人们想在 64 位 Linux 上编译它时,花了很长时间才消除 Mozilla/Firefox 等程序中的所有错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么/何时使用 `intptr_t` 在 C 中进行类型转换? 的相关文章

随机推荐