user-0 提问: 已知字符串形式的内存地址，求其在内存中的值（C实现）

回复:
user: user-1
content: 事实上，类型只是给我们看，也可以说看编译器看，编译器根据每种类型的size作操作的。内存里的东西都是数字，int类型的内存是数字，字符串类型里的东西就不是数字？  你上面的语句printf("%s",*c);错就错在这个C本身是指针，然后你写了*C，*C就是将这个str内容的前4个字节的内存数值。当然这个数值也可以是一个指针，因为指针在内存中本身也是数字。那print出错是因为这个指针所指向的内存越界了。正确的应该是printf("%s",c);这样。

user: user-2
content: ="0022114E"; 何必那么麻烦，字符串中的每个字符相对应：str[0]、str[1]、str[2]、str[3]……

user: user-3
content: 引用 27 楼 crf_net 的回复:读取其他进程的内存地址，确认无解么？ 汇编可以实现么？ bool AdjustPrivileges() {     HANDLE hToken;     TOKEN_PRIVILEGES tp;     TOKEN_PRIVILEGES oldtp;     DWORD dwSize=sizeof(TOKEN_PRIVILEGES);     LUID luid;      if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {         if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;         else return false;     }     if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {         CloseHandle(hToken);         return false;     }     ZeroMemory(&tp, sizeof(tp));     tp.PrivilegeCount=1;     tp.Privileges[0].Luid=luid;     tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     /* Adjust Token Privileges */     if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {         CloseHandle(hToken);         return false;     }     // close handles     CloseHandle(hToken);     return true; } BOOL HackWriteProcessMemory(HANDLE hProc, void * pDest, void * pSource, DWORD nSize, DWORD * pWritten) {     MEMORY_BASIC_INFORMATION mbi;      if (!WriteProcessMemory(hProc,pDest,pSource,nSize,pWritten)) {         VirtualQueryEx(hProc,pDest, & mbi, sizeof(mbi));         #ifdef _DEBUG             printf("Info:addr=%08x,size=%08x,allocprot=%08x,currprot=%08x\n",mbi.BaseAddress,mbi.RegionSize,mbi.AllocationProtect,mbi.Protect);         #endif         if (VirtualProtectEx(hProc,mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, & mbi.Protect)) {             if (!WriteProcessMemory(hProc,pDest,pSource,nSize,pWritten)) {                 #ifdef _DEBUG                     printf("Error:VirtualProtectEx succ,but WriteProcessMemory GetLastError=%d\n",GetLastError());                 #endif                 return FALSE;             } else {                 return TRUE;             }         } else {             #ifdef _DEBUG                 printf("Error:VirtualProtectEx GetLastError=%d\n",GetLastError());             #endif             return FALSE;         }     }     return TRUE; }

user: user-3
content: char *str="0022114E"; int addr; sscanf(str,"%x",&addr); printf("%02x",((unsigned char *)addr)[0]);   推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 引用 27 楼 crf_net 的回复:读取其他进程的内存地址，确认无解么？ 汇编可以实现么？ 去看看80x86保护模式吧，有助于你理解。

user: user-0
content: 读取其他进程的内存地址，确认无解么？ 汇编可以实现么？

user: user-4
content: 程序员写的程序都是面向逻辑地址的，你取的地址值肯定是在本进程的逻辑地址内部（当然该地址值必须是合理的），转换成物理地址之后也肯定在系统分给你的物理内存中，怎么样都不可能访问到别的进程的内存的。运行出错也只是因为你访问了你自己进程空间中系统规定不能访问的地方而已。

user: user-5
content: 引用 10 楼 crf_net 的回复:根据内存地址，读取其他进程对应地址的内容不能实现？当然不可以！你没有其他进程的内存权限。都能访问别人的内存不就乱套了。

user: user-6
content: 楼主要的是访问其他进程地址空间的内容，而且似乎他对系统API也不了解，大家都别在误导他了。不然讨论来讨论去都是当前进程空间，而1楼对此已经给出答案

user: user-7
content: 不用API 除非是子进程，并且和主进程共享地址空间，，否则没有办法

user: user-7
content: 1）把地址转换为指针对应的整型数据。。。即地址格式 2）调用API中的读写其他进程内存的读写函数，对其它进程的数据读写  对于 Windows 就是 ReadProcessMemory，WriteProcessMemory  3）可能有权限问题

user: user-8
content: 引用int a=100; int *p; p=&a; printf("%d",*p); 肯定没问题 我不但知道这个没问题  我还知道 int a=100; int *p; p=&a; printf("%s",*p); 肯定有问题

user: user-8
content: 引用 2 楼 crf_net 的回复:这个方式，可以骗过编译器，但是运行报错别逗  你给的地址如果是不可访问的  你用任何方式 都会运行出错  你给的地址可以访问 这样操作就OK  另外%s 输出一个 int 你是怎么想的 ??

user: user-9
content: 你的是字符串，得转换成整形，再转为地址，然后给相应的指针p,然后*p

user: user-9
content: 强转，然后给相应的指针p,然后*p不行吗？

user: user-0
content: int *c;   char *str="0022114E";   c=(int*)str;    printf("%s",*c); 编译没问题，运行报错！ 如果是： int a=100; int *p; p=&a; printf("%d",*p); 肯定没问题

user: user-0
content: 这个方式，可以骗过编译器，但是运行报错

user: user-8
content: int n ; sscanf str %d &n 假设你想那这个地址存储的int 的值  *(int*)n 假设你想拿这个地址存储的char的值  *(char*)n

user: user-8
content: 引用 20 楼 crf_net 的回复:你这里用了很多C++的东西，在C下编译不了。他没用什么C++的东西  倒是用了不少平台相关的东西  BYTE WINAPI LPCSTR

user: user-0
content: 引用 15 楼 Sandrer 的回复:LPCSTR hex_table_a = "0123456789abcdef"; int _hexIndex(char pch) {     int index = 0;     for (int i = 0; i < 16; i++)     {         if (pch == hex_table_a[i])         {             index = i;             break;         }     }     return index; }  int WINAPI Hex2ByteA(LPCSTR pszHexString, BYTE *pDataBuffer, int nBufferSize) {     int nResult = 0;     while (*pszHexString)     {         if (nResult >= nBufferSize) break;          *pDataBuffer++ = ((_hexIndex(*(char *)(pszHexString++)) << 4) | \             _hexIndex(*(char *)(pszHexString++))) & 0xff;          nResult++;     }      return nResult; }  int main() {     char *p = "0022114E";     BYTE data[16];     Hex2ByteA(p, data, 16);     void *pData = (void *)data;      return 0; }  你这里用了很多C++的东西，在C下编译不了。