C堆分配索引/访问

时间:2013-07-03 18:01:27

标签: c winapi

我相信我有一个非常基本的指针问题......我想要使用Windows API(所以像malloc这样的东西是不可能的)来创建一个动态的内存块来用于各种事情,保存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 中的值。

希望我很清楚我的困惑是什么,一如既往,非常感谢任何帮助。

干杯,

1 个答案:

答案 0 :(得分: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");
        }

    }
}