C 内存被破坏的地方?

C 内存被破坏的地方?,c,C,我无法得到内存损坏的位置,我将指针发送到FooFile\u工厂,它在堆上分配内存并初始化它。但是,当控件返回到名为FooFile\u工厂的空白处时,分配的内存将丢失 损坏/随机值。不明白为什么 typedef struct _FOO_FILE{ PFLT_CONTEXT StreamContext; ... } FOO_FILE, *PFOO_FILE; NTSTATUS FooFile_Factory( _Out_ PFOO_FILE pFile ) { NTST

我无法得到内存损坏的位置,我将指针发送到FooFile\u工厂,它在堆上分配内存并初始化它。但是,当控件返回到名为FooFile\u工厂的空白处时,分配的内存将丢失 损坏/随机值。不明白为什么

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)

...
}

我们可以找到一个类比:

#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); 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; }
#包括
void f(int**p){*p=…;}
int main(void){int*p=NULL;f(&p);printf(“%p\n”,(void*)p);返回0;}

我们可以找到一个类比:

#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); 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; }
#包括
void f(int**p){*p=…;}
int main(void){int*p=NULL;f(&p);printf(“%p\n”,(void*)p);返回0;}

我们可以找到一个类比:

#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); 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; }
#包括
void f(int**p){*p=…;}
int main(void){int*p=NULL;f(&p);printf(“%p\n”,(void*)p);返回0;}

我们可以找到一个类比:

#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); 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; }
#包括
void f(int**p){*p=…;}
int main(void){int*p=NULL;f(&p);printf(“%p\n”,(void*)p);返回0;}

所说的“内存损坏”是否意味着
pFile
仍然是
NULL
?实际错误或非预期差异是什么?pFile在FooFile\u FactoryBy“内存损坏”之后为NULL您的意思是
pFile
仍然是
NULL
?实际错误或未预期的差异是什么?FooFile\u FactoryBy“内存损坏”之后的pFile是NULL?您的意思是
pFile
仍然是
NULL
?实际错误或未预期的差异是什么?FooFile\u FactoryBy“内存损坏”之后的pFile是NULL您的意思是
pFile
仍然是
NULL
?实际错误或un/预期的差异是什么?在FooFile\u工厂之后,pFile是NULL