在我从这个精彩的网站上获得了如此多的Google搜索结果之后,我第一次在这里发帖.
基本上,我想找到存储在特定内存地址的变量名称.我有一个编写的内存编辑应用程序编辑单个值,问题是每次修补应用程序保存此值时,我必须将新内存地址硬编码到我的应用程序中,并重新编译,这需要花费很多时间维持它几乎不值得做.
我想要做的是获取存储在某个内存地址的变量的名称,这样我就可以在运行时找到它的地址并将其用作要编辑的内存地址.
这都是用C++编写的.
提前致谢!
编辑:
好吧我已经决定要从.txt文件中流式传输数据了,但我不确定如何将字符串转换为LPVOID以用作WriteProcessMemory()中的内存地址.这就是我尝试过的:
string fileContents;
ifstream memFile("mem_address.txt");
getline(memFile, fileContents);
memFile.close();
LPVOID memAddress = (LPVOID)fileContents.c_str();
//Lots of code..
WriteProcessMemory(WindowsProcessHandle, memAddress, &BytesToBeWrote, sizeof(BytesToBeWrote), &NumBytesWrote);
Run Code Online (Sandbox Code Playgroud)
代码在语法方面都是正确的,它编译和运行,但WriteProcessMemory错误,我只能想象它与我的错误的LPVOID变量有关.如果扩展我的问题的使用是违反规则,我道歉,如果是的话,我将删除我的编辑.
当我们打印变量的地址时,哪个地址被打印?
如果是虚拟内存,为什么会这样呢?
任何人都可以解释一下......
我的程序中出现了一个非常令人困惑的错误.我想我可能有两个同一类的不同对象,我认为我有相同的对象.这很令人困惑,因为我正在处理一个非常大的框架,在这个框架中获取指向我需要的对象的指针并不简单.
我的问题是,如果我有一个继承自Base的Derived类,并且我有一个指向Derived对象的指针,我怎样才能从派生对象中获取Base对象的地址?我正在使用基类的源代码,并在Base中打印出"this"的地址.在我的代码的另一部分中,检索指向Derived的指针.我需要能够通过Derived对象打印Base对象的地址,以确定我是否有指向我需要的特定Derived对象的指针.
我可能对地址如何在继承中使用C++有很大的误解.也许它们只是一个对象,而不是链接到派生对象的基础对象?
非常感谢你
编辑:我想这样做的原因纯粹是为了调试.问题是我使用的代码库不包含很多接口或受保护的成员,所以我不得不编辑源代码来访问某些信息.但是,当我调用我使用特定的Derived指针添加到Base类的方法时,我的程序崩溃了.我需要能够在这种情况下打印基础对象的地址,以便我可以确定这是否是正确的对象或我是否收到此错误,因为我实际上有一个指向错误对象的指针.我意识到我可以将代码添加到派生类中以使其打印其地址,但我只是想知道是否有可能在不编辑源代码的情况下获取地址.谢谢
我只是做了一个小愚蠢的程序,用一个指针传递一个变量包含在另一个变量中的值,就像对指针本身的介绍一样.我在分配之前和之后打印了所涉及的所有三个变量的值和位置.但是,作为指针中包含的值,我得到的地址不同于它指向的变量,我只是无法理解为什么.
这是我的主要计划:
#include <iostream>
#include "01.Point.h"
using namespace std;
int main()
{
int a,b;
cout << "Insert variable's value: ";
cin >> a;
int * point;
cout << "Before assignment:" << endl;
printeverything (a,b,point);
point = &a;
b = * point;
cout << "After assignment:" << endl;
printeverything (a,b,point);
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是我的功能实现:
#include <iostream>
#include "01.Point.h"
using namespace std;
void printeverything (int a, int b, int * c) {
cout << "First variable's value: " << a << …Run Code Online (Sandbox Code Playgroud) 最近我在为2D数组赋值时遇到了这个问题.为了表示我的问题,我创建了小C代码.我正在使用QT创建者(社区)3.3.0和minGW 4.9.1 32位.
#include <stdio.h>
int main(void){
double m[2][2];
for (int i = 0 ; i<3; i++){
for(int j=0; j<3; j++)
printf("%p[%d][%d] ", (void*)&m[i][j],i,j);
printf("\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
作为输出我得到内存地址
0028FE98[0][0] 0028FEA0[0][1] 0028FEA8[0][2]
0028FEA8[1][0] 0028FEB0[1][1] 0028FEB8[1][2]
0028FEB8[2][0] 0028FEC0[2][1] 0028FEC8[2][2]
Run Code Online (Sandbox Code Playgroud)
您可以看到不相等的数组项具有相同的地址.因此,当我为例如[1] [2]赋值时,[2] [0]中的值也会改变.
请给我任何关于如何解决这个问题的建议.非常感谢你.
这里有更多的代码,因为我遇到了我现在修复的主要程序的问题.
我有一个修改一系列字节的函数.在这个例子中,该函数应该连续地填充数字1到9的char数组的前9个字节.
进行两项测试.第一个是调用参数所在的函数(char*)&myvar.第二个测试仅用myvar作参数.当我想要在函数的参数部分中返回的字符串时,我以为我总是必须在char数组指针前面使用&.
为什么这个程序只在我不(char*)&添加我的char数组变量时才有效?
当我应用它时,我收到分段错误.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int func(char* abc){
char *p=abc;
int n;
for (n=1;n<10;n++){
*p=(unsigned char)(n+48);p++;
}
return 0;
}
int main(){
char vars[1000]="234";
char *myvar=vars;
printf("Function test\n");
int result=func((char*)&myvar); //causes segfault
printf("Function result %s\n",myvar); //segfault here
printf("Function test again\n");
int result2=func(myvar); //works
printf("Function result %s\n",myvar);
printf("DONE\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) c arrays pass-by-reference segmentation-fault memory-address
我们知道指针的大小取决于地址总线,那么80位的8位微控制器上的指针大小是多少?
我在C#.Net中编写了一个带有简单双变量的应用程序,它在运行时被更改.我的目标是从另一个程序中读取此变量.所以我用ArtMoney查看内存以获取内存地址.但我的变量的地址在运行时更改.谁能告诉我为什么?
在两次尝试中,地址都改变了两次然后稳定.地址的前两个字节在两次尝试时都相同但下一个字节在应用程序的每个开始时都不同.
我只是想尝试一下,我想知道这是怎么回事.我有以下代码:
int var1 = 132;
int var2 = 200;
int *secondvariable = &var2;
cout << *(secondvariable+2) << endl << sizeof(int) << endl;
Run Code Online (Sandbox Code Playgroud)
我得到输出
132
4
那么第二个int怎么可能只有2个地址更高?我的意思是不应该是4个地址吗?我目前在WIN10 x64下.
问候
由于堆栈向下增长,即朝数字较小的内存方向扩展,所以这&i < &j是正确的。如果我错了,请指正我,但是我想这是C创建者(由C ++维护)的设计决策。但是我不知道为什么。
同样奇怪的是,堆分配的对象pin位于数值上比堆栈变量高的内存地址,这也与以下事实相矛盾:堆位于数值上比堆栈小(且向上递增)。
#include <iostream>
int main()
{
int i = 5; // stack allocated
int j = 2; // stack allocated
int *pi = &i; // stack allocated
int *pj = &j; // stack allocated
std::cout << std::boolalpha << '\n';
std::cout << (&i < &j) && (pi < pj) << '\n'; // true
struct S
{
int in;
};
S *pin // stack allocated
= new S{10}; // heap allocated
std::cout << '\n' …Run Code Online (Sandbox Code Playgroud)