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