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)