如何在内存位置取消指针,并用值启动它

how to declair a pointer at a memory location and a initilize it with a value

本文关键字:启动 指针 内存 位置 取消      更新时间:2023-10-16

当我运行这段代码时,我得到了一个分段错误,我明白为什么我得到它是因为我没有使用新的初始值设定项为它分配空间。我该如何做我想做的事情?你应该能够通过查看我的代码来看到我在做什么,但万一你看不出来。我正在尝试声明指向特定地址的指针,然后将值传递给该地址。这是我的代码:

#include <iostream>
using namespace std;
int main(){

double *ptr;
ptr= (double*) 0x7fff07814c28;
*ptr= 77.9;
cout<< "pointer value n";
cout<< ptr;
cout<< "n";
cout<< "value pointed to by pointer n";
cout<< *ptr;
cout<< "n";
}

如何解开指针....

你可以像这样声明一个指针(指向double):

double* ptr;

。在内存位置...

您可以使用内存位置初始化指针:

double* ptr = some_address;

或者在声明后分配它:

ptr = some_another_address;

并用值启动它

有几种方法可以获取对象的存储:

  • 您可以通过定义变量来获取静态、线程静态和本地存储。例如,指针变量ptr的存储是这样分配的 - 不要与指针指向的存储混淆。
  • 您可以使用 a(n 分配)new表达式(或 C 标准库中的std::malloc系列函数)获取动态存储。

这两个选项都不允许您指定应放置存储的内存地址。在标准C++中,无法从任意地址请求存储变量。


当我运行此代码时,我遇到分段错误

从C++的角度来看,原因:你通过不指向对象的指针间接。程序的行为未定义。

从操作系统的角度来看,原因:进程尝试写入未映射的虚拟地址,或者标记为受保护或只读,因此操作系统发出信号并终止进程。


现在,当且仅当您使用的C++实现保证可以使用某些任意内存位置进行存储时,您可以使用 placement-new 表达式在该内存位置中创建对象。这种情况的一个例子是mmapPOSIX系统上的调用。下面是如何在此类存储中创建对象的示例:

// let there be storage at some memory address
// let the amount of storage, and alignment of the address be sufficient for T
char* storage = some_special_address;
// create an object into the storage
T* tptr = new(storage) T;
// after you're done using the object, destroy it:
tptr->~T();
// after destruction, the storage can be released, if needed and if possible

我该如何做我想做的事情?

在不使用虚拟内存的系统(即没有操作系统的系统)上运行程序。然后查阅该系统的手册,了解您可以使用的内存地址。然后,请参阅前面的示例,了解如何在您控制的存储中创建对象。确保地址满足所创建对象的对齐要求。

访问内存空间中的特定地址取决于平台和操作系统。

在许多桌面系统(例如Windows和Linux)上,操作系统授予程序访问部分内存的权限。 超出这些限制的任何访问都将导致分段错误或其他错误。 您必须具有内核权限才能访问内存中的特定区域,前提是该地址范围内有内存。

在嵌入式系统上,指针被分配到特定地址,以访问内存和硬件设备。 还取决于操作系统(如果有)是否授予您访问这些设备的权限。 此外,当您访问未定义的地址或没有任何关联地址的地址时,请为未定义的行为做好准备。 (在许多嵌入式系统上,寻址空间被解码用于各种目的,例如USB控制器。 如果地址未解码,则未定义的行为将抬起其丑陋的头。

在访问随机位置之前,请验证那里是否有某些内容以及您是否有权访问它。

在互联网上搜索"操作系统虚拟内存"。

ptr= (double*) 0x7fff07814c28;

这没有任何意义。在现代操作系统中,内存操作不是真实模式,因此您无法直接解决它。

内存不是 C 数组(例如,如果您有 4GB,则无法unsigned long m[0]寻址第一个字节)。

内存由 CPU 以各种模式(受保护,长是标准模式)进行管理,因此,您无法知道"确切"阵列位置。

简而言之,使用new[],甚至更好的STL。