c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?相关的知识,希望对你有一定的参考价值。

img.chist = new unsigned short[img.imgsize/64*9];
cout << *(img.chist + img.imgsize / 64 * 9 * 2 - 1);
叉号在第二行
这里是不是应该是unsigned short数组有[img.imgsize/64*9]个元素,占用内存为[img.imgsize/64*9]*2啊
最后一个元素的地址到底是多少啊

例:

int a[3] = 1, 2, 3 ;

int *p = a;

则p、p+1、p+2分别指向数组a的3个元素。不需要自己推算实际占用大小,这是编译器的事情

ifstream inFile;

ofstream outFile;

outFile.open("c:\\\\b.txt",ios::out);

char univ[] = "Tsinghua",name[10];

int course = 111,number;

outFile<<univ<<endl;

outFile<<course<<endl;

inFile.open("c:\\\\b.txt",ios::in/*|ios::nocreate*/);

if(!inFile)

cout<<"不能打开b.txt"<<endl;

char c;

inFile>>name>>c>>number;

outFile<<"name:"<<name<<endl;

outFile<<"number:"<<number<<endl; 

 

右值引用与转移语义

在旧标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以做参数传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真正的右值还是普通const变量。而且,由于类型为const &,函数也无法改变所传对象的值。

C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。这种改变将允许某些对象创建转移语义。

以上内容参考:百度百科-c++0x

参考技术A 举个最简单的例子:
int a[3] = 1, 2, 3 ;
int *p = a;
则p、p+1、p+2分别指向数组a的3个元素。不需要自己推算实际占用大小,这是编译器的事情

如何在 C++ 中读取硬编码地址的值?

【中文标题】如何在 C++ 中读取硬编码地址的值?【英文标题】:How to read a value of an hard coded address in C++? 【发布时间】:2011-03-01 17:42:11 【问题描述】:

我正在寻找位于地址 302H 中的值。目的是从硬件(104pc 堆栈的一部分)读取输入。当我运行以下代码时出现此错误:Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.

#include <stdlib.h> 

#define PORTBASE 0x302
int _tmain(int argc, char *argv[])

    int value;
    int volatile * port = (int *) PORTBASE;
    printf("port = %d\n", port);
    value = *port;
    printf("port value = %d\n", value);

编辑:

我在 widows xp 下运行它。下面是我在板上可以找到的唯一文档

编辑:

从您下面的回答中,我可以看出我需要为该板编写一个驱动程序。有人可以向我指出如何执行此操作的资源吗?

【问题讨论】:

那么它还没有被内存映射到你的地址空间。我希望你不能从 Windows 用户代码中做到这一点——你需要从内核驱动程序中做到这一点。你有什么文档/示例代码? 有一个通用的 Windows 驱动程序,可以让您从用户模式程序读取/写入 IO 端口。我以前用它来读取/写入 0x378 的并行端口。我看看能不能再找到它。 【参考方案1】:

为了在Windows下直接访问物理内存,需要开发驱动。我建议您阅读Virtual Address Space 了解原因。简短的故事:您从用户模式进程中看到的内存地址与物理内存地址无关,而硬件所在的地址受到操作系统的保护,以防止用户模式应用程序搞砸。

【讨论】:

【参考方案2】:

我假设您的程序以普通用户身份运行。为了防止您损坏操作系统和使系统崩溃,现代操作系统和 CPU 会阻止您访问不属于您的程序的内存。

为了访问此类设备内存,您需要在内核 CPU 模式而不是用户模式下运行。使用此类设备的常用方法是编写在内核模式下运行的低级设备驱动程序,并将其用作用户模式程序的接口。

【讨论】:

【参考方案3】:

您不能直接从用户模式程序访问硬件。为此,您需要一个设备驱动程序。

硬件不附带一些您应该安装的软件吗?查看软件文档了解如何调用它。

【讨论】:

没有软件...我想用户(我)可以写:S【参考方案4】:

有几个现成的驱动程序可以让用户模式应用程序读写 IO 端口;其中最著名的一个是inpout32.dll,其他提到了here,要找到它们,一个好的搜索关键字是“写并行端口NT”(因为它们最常用于此任务)。

通常,它们通过加载内核模式驱动程序(需要管理权限的操作)然后在每次调用 dll 函数执行读/写时从用户模式调用它来工作。

但是请注意,这些库中的大多数都没有任何形式的访问控制,因此通过加载它们的驱动程序,您实际上允许任何知道如何使用它的应用程序在 IO 端口上读/写,这是相当安全的风险。

【讨论】:

ltalia:感谢您的回答!我将阅读该页面。我认为这不会带来太大的安全风险,因为 104pc 不太可能与任何网络分开。我也有兴趣尝试编写自己的驱动程序。它似乎是一个编写驱动程序的好板子,因为它的操作相对简单 @Richard:嗯,有几个这样的驱动程序是开源的,所以你应该很容易看到它们里面发生了什么。 :)【参考方案5】:

当然,如果你想全力以赴,你可以下载Windows Device Driver SDK

【讨论】:

以上是关于c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?的主要内容,如果未能解决你的问题,请参考以下文章

0x00007FFD15EA9E08 处(位于 test1.exe 中)有未经处理的异常: Microsoft C++ 异常

0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突。

在项目 2017.1.exe 中的 0x0FDD053F (ucrtbased.dll) 处引发 bmp 文件异常错误:0xC0000005:访问冲突写入位置 0xCDCDCDCD

在类 12.exe 中的 0x7B37FF80 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00B64F88。发生了

如何在 C++ 中读取硬编码地址的值?

C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004