首页 > 解决方案 > 使用整数 (int) 作为指针参数

问题描述

如果我们忽略这些方面:

  1. 不好的做法
  2. 不合理的需要
  3. 可能还有其他人......

只要地址保持在区间内,该程序的风险是什么(运行时:崩溃、未定义行为、分段错误。实现定义的行为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;
}

标签: c++11pointersintparameter-passing

解决方案


您的程序具有实现定义的行为。的结果streamAdr << pTab;和结果(int*) i都是实现定义的

因此,您需要查看特定编译器的文档,以确定该程序是否按照您期望的方式运行。

没有一般保证这会正确运行。


从指针到整数的转换也可以简单得多:

reinterpret_cast<std::intptr_t>(pTab)

这是假设您的实现支持std::intptr_t. 否则(特别是 C++11 之前的版本),您可以尝试其中一种标准整数类型。如果使用的类型太小而无法容纳指针值,则编译应该失败,否则它将与std::intptr_t.

如果此转换产生的值没有通过转换为 缩小,则转换int回的结果int*将按预期运行(即您获得指向数组第一个元素的指针),否则它仍然具有实现定义行为。


推荐阅读