【发布时间】:2012-04-27 05:53:55
【问题描述】:
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 \r\n",d.getAddress(address));
d = d.getNext();
}
return 0;
}
它返回前两个(它们是相同的,并且应该不同[可以从调试器中看出]...)然后崩溃。
它只是创建一个链表。受保护的成员Data* _next ...一连串。
unsigned char* 来自 Windows 函数 VirtualQueryEx,它是它返回的 MEMORY_BASIC_INFORMATION 数据结构的一部分。
this->_address = (unsigned char*)meminfo->BaseAddress; // casted from void*
它是 void*,但我看到它在其他代码中转换为 unsigned char*。在调试器中,我可以看到它表示为十六进制数字。
D1: + _address 0x7ffd5000 <Bad Ptr> unsigned char *
D1->_next:+ _address 0x7f6f0000 "áå•ú`©" unsigned char *
D1->_next->_next+ _address 0x7ffb0000 " " unsigned char *
【问题讨论】:
-
请出示makealinkedlisthere()函数的源码
-
您没有提供足够的信息。
Data::makealinkedlistthere是做什么的? -
您需要提供有关数据的更多信息,以便我们弄清楚这里发生了什么。特别是
makealinkedlisthere和getNext。顺便说一句,循环看起来很可疑。 -
你总是将相同的指针传递给'getAddress'方法,所以它自然总是返回相同的结果:指向'address'数组的第一个字符的指针。它每次都用不同的数据填充该数组,但您的代码不会打印该数据,只打印一个指向它的指针。
-
但是
MEMORY_BASIC_INFORMATION.BaseAddress不是字符串。你不能像字符串一样复制它!