2013-07-03 13 views
1

我相信我有一个非常基本的指针问题...我想使用Windows API(所以像malloc这样的东西是不可能的)来创建一个动态内存块用于各种在分配区域内的各种偏移处保存C字符串,整数值等。C堆分配索引/访问

我使用的代码如下:

HANDLE hProcess = NULL; 
LONG32 *lpHeapAddr = NULL; 

hHeap = GetProcessHeap(); 
lpHeapAddr = (LONG32*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 0xC00); 

我的问题是,我怎么能访问返回的空间内的特定偏移。变量 lpHeapAddr包含内存分配的基地址。我怀疑 lpHeapAddr [0x10]会给我访问到这个分配的第16偏移量。但是我发现这样的事情不工作,我怀疑这只是因为我的逻辑和理解是不正确:

char some_array[] = {0xED, 0x84, 0x5A, 0x20}; 

for(i = 0; i < 0x04; i++){ 
    lpHeapAddr[0x30+i] = some_array[i]; 
} 

值在 lpHeapAddr [的0x30]不在 some_array值。

希望这是明确的,我的困惑是一如既往,任何帮助,非常感谢。

干杯,

+3

应该是手柄,而不是手柄。应该是LONG32 * lpHeapAdr(缺少*)。显示真实的代码,以及它究竟发生了什么。 – manuell

+0

for循环中特定偏移量的值不像预期的那样......这是通过内存地址索引和递增的正确方法吗? – 5k1zk17

+0

yes.it是指向已分配内存块的指针 – qwr

回答

3

你需要知道指针数学;

type *pointer ; 
pointer+index; // address=pointer+sizeof(type)*index 
pointer[index] // address=pointer+sizeof(type)*index 
++pointer ; // address=pointer+sizeof(type) 

这里是代码:

char *memchar_addr=(char*)(lpHeapAddr[0x30]); 
        for(i = 0; i < 0x04; i++){ 
         memAddr[i] = some_array[i]; 
         printf("%c\t",memAddr[i]); 
        } 

下面是完整的代码。

#include <stdio.h> 
#include "windows.h" 
int main() 
{ 

    HANDLE hHeap;   // heap handle 
    hHeap=GetProcessHeap(); 
    char some_array[0x3F]; 
    memset(some_array,(int)65,sizeof(some_array)); 
    if (hHeap!=NULL) 
    { 
     int *memAddr=NULL; //pointer to memory 
     memAddr=(int*)HeapAlloc(hHeap,0,0xC00); 
     if (memAddr!=NULL) 
     { 
       int i; 
      for(i = 0; i < 0x3F; i++){ 
        memAddr[0x20+i] = some_array[i]; 
        printf("%d\t",memAddr[0x20+i]); 
      } 
      char some_array2[] = {0xED, 0x84, 0x5A, 0x20}; 

        for(i = 0; i < 0x04; i++){ 
         memAddr[0x30+i] =(int) some_array2[i]; 
         printf("%d\t",memAddr[0x30+i]); 
        } 

      if (HeapFree(hHeap,0,memAddr)==0) 
       printf("free error"); 
     } 

    } 
}