2016-10-03 106 views
-3

首先请原谅我有限的c知识,但我怎么可以在32位和64位平台上投入一个字符指针为长?此代码给了我与Visual Studio编译器警告C4311 2015铸造字符指针长

char *c; 
long l; 
l = (long)(c); 

感谢

编辑

错误代码是'类型转换':从 '字符*' 到 '长'指针截断 可以downvotes让我知道他们为什么downvoted?

+2

为什么你认为这是合理的**不包括警告信息??!? – Amit

+0

什么是警告信息?有许多编译器警告,我们怎么可能知道哪一个_you_遇到过? –

+1

你想用这个做什么? – ZenJ

回答

4

不要这样做,如果你能避免它。

C99(和更新)支持一种名为uintptr_t的类型。这是一个能够保存指针值的整数类型。有关更多信息,请参阅stddef.h

Visual Studio不知道完全支持C99。因此,你可能无法工作,但值得一试。

char* c = <some value>; 
uintptr_t ptr = (uintptr_t)c; 

如果您编译C源文件作为C++源,(使用/TC编译器选项),你应该能够使用它。

1

将指针指向整数的目的是什么?你可以使用一个联合体,一个结构体,或者一个void *。

Microsoft编译环境默认为LLP64,其中long为32位宽,如果您的指针为64位宽,则可能太窄。 - >https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

+1

我相信例程是计算一个因为它正在执行自己的堆栈处理,所以使用intptr_t或uintptr_t是一种解决方案? –

+0

simon-p-r,在这种情况下,还有size_t和ptrdiff_t数据类型,但我认为将指针存储为整数是滥用行为,导致代码难以阅读。我的建议就是 – user602469

+0

好吧,我感谢您的意见 –