内存损坏的地方?

时间:2014-08-07 15:31:13

标签: c

我无法获得内存损坏的地方,我发送指向FooFile_Factory的指针,它在Heap上分配内存并初始化它。但是当控件返回到调用FooFile_Factory的void时,分配的内存就是 损坏/随机值。无法理解为什么?

typedef struct _FOO_FILE{
    PFLT_CONTEXT StreamContext;
    ...
} FOO_FILE, *PFOO_FILE;



NTSTATUS
FooFile_Factory(
_Out_ PFOO_FILE pFile
)
{
    NTSTATUS status;

    pFile = ExAllocatePoolWithTag( //Allocation on heap
        NonPagedPool,
        sizeof(FOO_FILE),
        FOO_FILES_TAG);

    if (!pFile) {
        return INSTALL_MORE_MEMORY;
    }

    RtlZeroMemory(pFile, sizeof(FOO_FILE));

    //Some Initializatoin

    //Here pFile fields values are correct, PFLT_CONTEXT is null
    return status;
}

NTSTATUS
VoidThatCall()
{
NTSTATUS status;

PFOO_FILE pFile = NULL;
status = FooFile_Factory(pFile);
//--> Here PFOO_FILE fields values became corrupted (PFLT_CONTEXT give memory access error)

...
}

1 个答案:

答案 0 :(得分:3)

我们可以找到一个类比:

#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); return 0; }

由于按值调用函数,将打印3

在你的例子中,同样的事情发生了。

#include <stdio.h>
void f(int *p) { p = ...; }
int main(void) { int *p = NULL; f(p); printf("%p\n", (void *)p); return 0; }

调用函数中p的值不会改变。解决它的一种方法是使用指向指针的指针:

#include <stdio.h>
void f(int **p) { *p = ...; }
int main(void) { int *p = NULL; f(&p); printf("%p\n", (void *)p); return 0; }