【问题标题】:Assigning an array to an address and printing values将数组分配给地址并打印值
【发布时间】:2013-11-07 19:08:12
【问题描述】:

我需要做以下事情:

假设 C++ 数组

int fib[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

存储在 32 位机器上,内存地址为 0xA0000000(十六进制)。以下表达式的值是多少?

  fib     
  *fib     
  &fib[0]     
  &fib[6]     
  *(fib+7)

我尝试编写此代码以尝试打印出所需的值。

int main()
{
    int i = 0;
    int *p = &A0000000;
    cout << "i= " << i << endl;
    cout << "p= " << p << endl;
    *p = 0;
    cout << "i=" << i << endl;

    int &r = i;
    r = 0;
    cout << "i= " << i << endl;


    int fib[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
    cout << "fib= " << fib << endl;

    cout << "*(*fib)= "  << *fib     <<  endl;
    cout << "&fib[0]= "  << &fib[0]  <<  endl;
    cout << "*(fib+7)= " << *(fib+7) <<  endl;
    cout << "&fib[6]= "  << &fib[6]  <<  endl;

    system("PAUSE");
    return 0;
} 

我收到以下错误消息:

c:\users\inquirer\documents\visual studio 2010\projects\fib1\fib1\fib1.cpp(7): error C2065: 'A0000000' : undeclared identifier

提前感谢您的帮助。我需要做什么才能打印出正确的值?

【问题讨论】:

标签: c++ arrays memory-address


【解决方案1】:

要修复编译错误尝试

int* p=(int*)0xA0000000;

无论这对...有什么好处......

【讨论】:

  • 这就是它所说的:'fib1.exe':已加载 'C:\Users\Inquirer\Documents\Visual Studio 2010\Projects\fib1\Debug\fib1.exe',已加载符号。 “fib1.exe”:已加载“C:\Windows\SysWOW64\ntdll.dll”,找不到或打开 PDB 文件“fib1.exe”:已加载“C:\Windows\SysWOW64\kernel32.dll”,找不到或打开 PDB 文件“fib1.exe”:已加载“C:\Windows\SysWOW64\KernelBase.dll”,找不到或打开 PDB 文件“fib1.exe”:已加载“C:\Windows\SysWOW64\msvcp100d.dll” , 符号加载。 “fib1.exe”:已加载“C:\Windows\SysWOW64\msvcr100d.dll”,已加载符号。
  • 非常感谢您的帮助!
【解决方案2】:

你不能在任意的虚拟内存地址存储东西。

*p = 0; 将在运行时崩溃,因为 0xa0000000 可能不是要写入的有效位置。

试试int *p = new int 并打印你得到的地址。它不如 0xa0000000 漂亮,但足以使您的实验可视化。

【讨论】:

  • '你不能在任意的虚拟内存地址上存储一些东西。'这是完全错误的,如果你不能这样做会很糟糕(这会给我很难在 EBI 上连接 FPGA 寄存器接口)。您不能在受 MPU 保护的系统或在虚拟内存环境中运行进程的操作系统中!
  • @g-makulik 我对 C++ 标准不太了解,但我很确定它会说类似实现定义的内容(我倾向于猜测甚至未定义)。这意味着通常您不能取消引用任意“数字”。 OP 在 Windows 上不起作用(没有 WinAPI 帮助和幸运的是虚拟地址尚未保留)。
  • 您所说的存储/读取任意地址值仍然是完全错误的。在 C++ 语法中可能,并且 OP 要求编译时错误!所以你的答案是超越问题的一步。
  • 拜托!您在此处所说的真的完全错误:'您不能将某些内容存储在任意虚拟内存地址。 ' 你可以,这是 C++ 语言的一大优势,即使这超出了你的使用范围!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多