将String转换为unsigned long int

时间:2016-02-24 18:18:06

标签: c casting

我遇到了一些C代码,它们执行如下操作。只是想知道是否有人可以告诉我这段代码到底发生了什么,因为我以前从未真正遇到过这样的事情。我关心的路线是路径被赋予值

的路线
int main(void)
{
    unsigned long path;

    //...

    path = (unsigned long) "somevariable";


    return 0;
}

我试着四处寻找,但我找不到任何有用的东西。只是想知道是否有人可以澄清发生了什么。特别是,我想知道:

  1. 分配给路径的是什么?它是一个char *转换为无符号长?
  2. 如果path是字符串“somevariable”的地址,那么字符串“somevariable”的范围是什么?它是否具有函数init的本地作用域,或者它与path具有相同的作用域?它是如何分配的(自动与动态)?
  3. 如果有人知道可以参考的c标准部分来理解这一点,我们也将不胜感激。

3 个答案:

答案 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*。这仍然会有几个问题。例如,两个相同的字符串可以具有不同的地址。

如果没有更多的背景,我们无法分辨这意味着什么。