如何在内存位置取消指针,并用值启动它
how to declair a pointer at a memory location and a initilize it with a value
当我运行这段代码时,我得到了一个分段错误,我明白为什么我得到它是因为我没有使用新的初始值设定项为它分配空间。我该如何做我想做的事情?你应该能够通过查看我的代码来看到我在做什么,但万一你看不出来。我正在尝试声明指向特定地址的指针,然后将值传递给该地址。这是我的代码:
#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 表达式在该内存位置中创建对象。这种情况的一个例子是mmap
POSIX系统上的调用。下面是如何在此类存储中创建对象的示例:
// 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。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 启动线程会导致指针初始化时出现分段错误
- 操作员的地址可以启动指针,但填充值是垃圾
- 如何在内存位置取消指针,并用值启动它
- 如何在启动时在Qt应用程序中隐藏鼠标指针
- 有关启动引用指针的引用的问题
- 在堆上启动的指针数据成员
- 如何在启动时隐藏鼠标指针
- 如何将双指针从 C# 传递到 COM 并在 COM 中启动它
- 启动 std::thread 时无法将(函数指针)左值绑定到(函数指针)右值
- 基类的指针数组;每次项目启动我都有不同的结果
- CUDA在使用函数指针时启动主机函数作为内核