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 に答える