C++11 使用整数(int)作为指针参数

C++11 使用整数(int)作为指针参数,c++11,pointers,int,parameter-passing,C++11,Pointers,Int,Parameter Passing,如果我们忽略这些方面: 坏习惯 不正当的需要 可能还有其他人 只要地址保持在间隔INT_MIN和INT_MAX内,该程序的风险是什么(运行时:崩溃、未定义的行为、分段错误。实现定义的行为:错误的地址生成): #include <iostream> using namespace std; #include <sstream> #include <string> #define TAB_SIZE 2 void UseIntAsAdress (unsig

如果我们忽略这些方面:

  • 坏习惯
  • 不正当的需要
  • 可能还有其他人
  • 只要地址保持在间隔
    INT_MIN
    INT_MAX
    内,该程序的风险是什么(运行时:崩溃、未定义的行为、分段错误。实现定义的行为:错误的地址生成):

    #include <iostream>
    using namespace std;
    #include <sstream> 
    #include <string>  
    
    #define TAB_SIZE 2
    
    void UseIntAsAdress (unsigned int  i)
    {
        int *pTab =  (int*) i;
        for (int i=0; i< TAB_SIZE; i++)
            cout << "tab ["<<i<<"] = "<< pTab[i] <<endl;
    }
    
    int main()
    {
        int *pTab = new int [TAB_SIZE];
        for ( int i=0; i<TAB_SIZE; i++)
            pTab [i] = i; 
    
        std::stringstream streamAdr;
        streamAdr << pTab;  
        std::string name = streamAdr.str(); 
    
        unsigned int i = stoi(name.c_str(), 0, 16);
    
        UseIntAsAdress (i);
    
        delete [] pTab;
        return 0;
    }
    
    #包括
    使用名称空间std;
    #包括
    #包括
    #定义选项卡大小2
    void UseIntAsAdress(无符号整数i)
    {
    int*pTab=(int*)i;
    对于(int i=0;i
    您的程序有实现定义的行为。
    streamAdr的结果和您的程序都有实现定义的行为。
    streamAdr的结果和您所说的风险是什么?@Cubic在这种情况下,此程序可能崩溃或产生分段错误,或未定义的行为,或例如越界。主要的这里的isk是地址将不会保持在区间
    INT\u MIN
    INT\u MAX
    …在现代x64系统上,它通常远远超出该范围。如果您想将一些不透明的地址作为整数传递,应该使用
    ::std::uintptr\u t
    。“如果我们忽略[风险],风险是什么?”我认为最严重的问题是缺乏可维护性。“为什么Parva在这里使用
    int
    ,而不是指针或
    std::uintpttr\t
    ?我缺少什么?”如果您只对该代码的潜在运行时问题感兴趣,那么您需要在问题中指定。您所说的风险是什么?@Cubic在这种情况下,thisi程序可能会崩溃或产生分段错误,或未定义的行为,或例如越界。这里的主要风险是地址不会保留在间隔
    INT中_MIN
    INT\u MAX
    …在现代x64系统上,它通常远远超出该范围。如果您想将一些不透明的地址作为一个整数传递,则应使用
    ::std::uintptpr\u t
    。“如果我们忽略[风险],风险是什么?”我认为最严重的问题是缺乏可维护性。“为什么Parva在这里使用
    int
    而不是指针或
    std::uintptpr\u t
    ?我缺少什么?"如果您只对该代码的潜在运行时问题感兴趣,那么您需要在问题中指定。谢谢。不幸的是,我的实现不支持
    std::intptr\u t
    @landstapper如果您使用的是一些不寻常的体系结构,您可能希望将其添加到问题中。此外,您可以使用一个标准的intEgER类型代替了代码> STD::IpTrrtt。如果类型太小,不能保存指针值,它应该给出编译错误,否则它应该按照我所描述的方式工作。但是如上所述,如果不定义“代码> STD::ItpRtTrt< /Cord>,如果存在这样的整数类型,那将是很奇怪的。我在讲C++版本。一个通常的体系结构。@ ListStistOK,然后尝试一个标准整数类型,如上面所提到的。我建议你在你的问题中添加相应的C++版本标签,因为通常你假设至少有C++ 11可用。我在回答中所写的另外,也应用了前C ++ 11。我错过了一个ILUD,I。可以在C++11上使用
    std::intptr\u t
    和im。谢谢。不幸的是,我的实现不支持
    std::intptr\u t
    @landstapper,如果您使用的是一些不寻常的体系结构,您可能希望将其添加到问题中。此外,您可以使用一个标准整数类型来代替
    std::intptr\u t
    。如果类型为太小,不能保存指针值,它应该给出编译错误,否则它应该以我描述的方式工作。但是正如上面提到的,如果不定义“代码> STD::ItpRtTrt< /Cord>,如果存在这样的整数类型,那将是很奇怪的。我在谈论C++版本。我有一个通常的体系结构。”ListSister-OK,然后尝试一个标准。整数类型,我建议你在你的问题中添加相应的C++版本标记,因为通常你假设至少有C++ 11可用。我在答案中写的另外,也应用了前C++ 11。我错过了一个插图,我可以使用<代码> STD::ItpTrtt。
    reinterpret_cast<std::intptr_t>(pTab)