c++11 - 使用整数 (int) 作为指针参数
问题描述
如果我们忽略这些方面:
- 不好的做法
- 不合理的需要
- 可能还有其他人......
只要地址保持在区间内,该程序的风险是什么(运行时:崩溃、未定义行为、分段错误。实现定义的行为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;
}
解决方案
您的程序具有实现定义的行为。的结果streamAdr << pTab;
和结果(int*) i
都是实现定义的。
因此,您需要查看特定编译器的文档,以确定该程序是否按照您期望的方式运行。
没有一般保证这会正确运行。
从指针到整数的转换也可以简单得多:
reinterpret_cast<std::intptr_t>(pTab)
这是假设您的实现支持std::intptr_t
. 否则(特别是 C++11 之前的版本),您可以尝试其中一种标准整数类型。如果使用的类型太小而无法容纳指针值,则编译应该失败,否则它将与std::intptr_t
.
如果此转换产生的值没有通过转换为 缩小,则转换int
回的结果int*
将按预期运行(即您获得指向数组第一个元素的指针),否则它仍然具有实现定义行为。
推荐阅读
- php - move_uploaded_file() php 函数不适用于多次上传
- node.js - 在创建浏览器期间 Firebase 计划函数中的 Puppeteer 超时
- python - 如何使用 pandas 将列中的 1225002 等值转换为 1.2M?
- assembly - 我在汇编中打印字符串时遇到问题
- javascript - 在角度为 8 的 angular-dataTable 中使用 num-string 和 date 对列进行排序
- list - 如何组织`List类型的数据
- >`
- python - process.start() 是否意味着进程立即启动?
- python-3.x - 如何计算 pd 数据框中的百分位数?
- javascript - 您好,在 node.js 项目中,我无法将文件移动到 src 文件夹,因为运行节点文件时出现错误。现在文件在根目录
- asp.net - 使用管道和地图响应时的角度过滤问题