我相信我有一个非常基本的指针问题......我想要使用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 中的值。
希望我很清楚我的困惑是什么,一如既往,非常感谢任何帮助。
干杯,
答案 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");
}
}
}