2013-07-03 44 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"); 
     } 

    } 
}