1

我相信我有一个非常基本的指针问题......我想使用 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的值。

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

干杯,

4

1 回答 1

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");
        }

    }
}
于 2013-07-03T18:31:47.987 回答