【问题标题】:Unhandled exception at 0x00af7230 in CPP_TEST.exe: 0xC0000005: Access violation writing location 0x00abcdef [closed]CPP_TEST.exe 中 0x00af7230 处未处理的异常:0xC0000005:访问冲突写入位置 0x00abcdef [关闭]
【发布时间】:2013-02-14 19:04:17
【问题描述】:

我收到Access violation writing location at 0xABCDEF。 我尝试了很多方法来解决这个问题。但最后还是做不到。

#define xyz 0xABCDEF
#define ptr (UINT16 *) (xyz)

int main()
{

    //int *ptr;
    //ptr = (int*)malloc(sizeof(int));
    *ptr = 0;
    return 0;
}

请帮帮我。

【问题讨论】:

  • 你想做什么?
  • @BlagovestBuyukliev:我想在那个特定位置填零。
  • 并非每个位置都是“合法”位置。在没有引用变量的情况下从任意位置读取或写入在技术上是未定义的行为。
  • @BlagovestBuyukliev:它是一个配置寄存器地址。我需要在那里禁用中断
  • 如果你在操作系统中运行,操作系统应该提供一种方法来做到这一点——并阻止你自己做。它的全部工作是充当进程之间的裁判;它控制硬件和内存,因此进程不会互相践踏。如果您正在编写内核驱动程序,您只需要直接处理硬件......此时您应该已经对操作系统的保护机制如何工作有所了解。

标签: c++ c linux-kernel operating-system interrupt


【解决方案1】:

操作系统只会为您的程序分配一定数量的内存。 您可以使用 malloc() 请求额外的内存,然后您将从堆中获得一块连续的内存,此分配再次由操作系统完成。

记住这些点,

您的程序无法指定您希望分配内存的内存地址。

您的程序无法访问任何随机内存地址,因为它将被虚拟内存管理器监控,任何违规都会引发硬件异常。

希望你的内存被分配到一个特定的地址肯定是没有逻辑的。

【讨论】:

  • 虽然总的来说这是个好建议,但还是有点夸大其词。在某些情况下,想要使用特定地址有的逻辑;内存映射 I/O,尤其是视频缓冲区作为示例浮现在脑海中。只是碰巧,任何自尊的 x86 操作系统都不会让您在不先与它交谈的情况下这样做。
  • @cHao,是的,我知道只使用内存的某些部分有好处,例如在 LOW_MEM、HIGH_MEM、DMA 之外,对于性能关键的应用程序,我会选择 LOW_MEM,因为虚拟地址直接映射到逻辑地址,绕过虚拟内存管理器,因此减少了 VMM 使用请求分页和设置页面标志分配内存的延迟。但是仍然没有我遇到过的地方,你可以准确地选择页面地址,除了涉及固件的情况。
【解决方案2】:

你不能这样做,因为你试图使用的内存位置不属于你的进程。您的程序实际上没有适当的权限来执行此操作。

尝试手动猜测和定义内存地址不是一个好习惯,因为使用这样的地址基本上会导致未定义的行为情况。

实际上,您尝试使用的地址0xABCDEF 看起来像是从某种教程中获取的示例。您可能会将其替换为特定于您的系统和操作系统配置的实际地址?

【讨论】:

  • 他不仅没有权限,即使没有段错误也是未定义的行为。那块内存也可以保存程序/数据的其他部分。
  • @BlagovestBuyukliev:技术上是这样。但是这种“UB”是相当标准的,在某些情况下甚至是必要的,比如当你用 C 编写操作系统时。有些东西告诉我,这里不是这种情况...... :)
  • @cHao:是的,你是对的。
  • @MikhailKalashnikov:我认为你是对的......与其用匿名地址挠头,我应该继续使用具体地址
【解决方案3】:

您无权将不属于您的进程的位置填充为零。

如果您想在特定位置填充零,则必须首先分配该内存...您必须删除“#define ptr...”行并在注释代码中执行类似操作:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int* ptr = (int*) malloc(sizeof(int));
    *ptr = 0;
    return 0;
}

【讨论】:

  • :- 我需要在那个特定位置填零
  • 为什么?为什么那个位置对你来说很特别?
  • :- 上面的代码是我项目的一个例子或一小部分,实际上我需要禁用一个中断,它发生在那个位置。
猜你喜欢
  • 2019-03-16
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多