C/C++ 未处理的读取冲突
C/C++ strcpy unhandled read violation
unsigned char* Data::getAddress(unsigned char* address)
{
strcpy((char*)address, (char*)this->_address);
return (unsigned char*)address;
}
int main()
{
Data d;
d.makealinkedlisthere();
while (d)
{
unsigned char address[256];
printf("0x%08x rn",d.getAddress(address));
d = d.getNext();
}
return 0;
}
它返回前两个(这是相同的,它应该是不同的[可以从调试器中看出]...),然后崩溃。
它只是创建一个链表。 受保护的成员Data* _next
...他们一连串。
无符号字符* 来自 Windows 函数VirtualQueryEx
它返回的MEMORY_BASIC_INFORMATION
数据结构的一部分。
this->_address = (unsigned char*)meminfo->BaseAddress; // casted from void*
它是 void*,但我看到它在其他人的代码中转换为无符号字符*。在调试器中,我可以看到它表示为十六进制数。
D1: + _address 0x7ffd5000 <Bad Ptr> unsigned char *
D1->_next:+ _address 0x7f6f0000 "áå•ú`©" unsigned char *
D1->_next->_next+ _address 0x7ffb0000 " " unsigned char *
MEMORY_BASIC_INFORMATION。基址是页面区域的位置,而不是字符串,并且不能保证它将以空终止。从 MSDN 站点,您可以看到MEMORY_BASIC_INFORMATION结构
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
要复制数据,应使用大小 = 255' 的memcpy
。
回顾您的代码,如果没有其他问题,将其更改为
PVOID Data::getAddress(PVOID address,size) {
memcpy((address, (void *)this->_address, size);
address[size]=NULL;
return address;
}
int main() {
Data d;
d.makealinkedlisthere();
while (d) {
unsigned char address[256];
printf("Address: 0x%08x n",d.getAddress((PVOID)address),sizeof(address));
printf("Data: %sn",(LPSTR)d.getAddress((PVOID)address),sizeof(address));
d = d.getNext();
}
return 0;
}
应该工作
另请注意,在memcpy
之前存储RegionSize
并进行边界检查是安全的。
相关文章:
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 尝试通过共享指针使用变量时读取访问冲突
- C++ 读取访问冲突,0xCDCDCDCD
- 读取缓冲区时访问冲突 UNICODE_STRING
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 使用智能指针读取访问冲突
- 引发异常:读取访问冲突.**此**0x40错误
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 使用 Win32 读取文件时,glShaderSource 访问冲突
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 0xC0000005:读取位置0xCDCDCDC1时发生访问冲突
- 使用 vtkDICOMWriter 编写 DICOM 时访问读取冲突
- 从结构传递数组成员会导致访问读取冲突
- 访问用于对象的向量时读取冲突
- 将两个字符串一起分配,获取访问读取冲突
- 访问 2D 数组时的读取冲突
- C/C++ 未处理的读取冲突
- 0xccccc处的访问读取冲突