我遇到了一些C代码,它们执行如下操作。只是想知道是否有人可以告诉我这段代码到底发生了什么,因为我以前从未真正遇到过这样的事情。我关心的路线是路径被赋予值
的路线int main(void)
{
unsigned long path;
//...
path = (unsigned long) "somevariable";
return 0;
}
我试着四处寻找,但我找不到任何有用的东西。只是想知道是否有人可以澄清发生了什么。特别是,我想知道:
答案 0 :(得分:2)
1)是的,它是指向unsigned long
的投射值
2)字符串文字始终静态分配在只读存储器中
3)您可以参考Section 6.4.5 (String Literals)
答案 1 :(得分:1)
哟不能将字符串强制转换为unsigned long,你必须使用类似strtoul()的函数
http://www.tutorialspoint.com/c_standard_library/c_function_strtoul.htm
答案 2 :(得分:0)
此代码尝试将字符串的地址转换为unsigned long
变量。它会在LLP64实现上失败,其中指针为64位宽,unsigned long
仅为32位宽,或指针宽度大于long
的任何其他编译器。
遵循该标准的完全可移植版本将是const uintptr_t path = (uintptr_t)(void*)"somevariable";
。 uintptr_t
(在<stdint.h>
中定义)保证能够存储任何void*
的位,并且保证任何类型的指针都转换为void*
。这仍然会有几个问题。例如,两个相同的字符串可以具有不同的地址。
如果没有更多的背景,我们无法分辨这意味着什么。