代码类似于:
char *global1 = NULL;
char *global2 = NULL;
char *global3 = NULL;
char *global4 = NULL;
void func2(char *gPtr, char **gPtrToInitialize)
{
if(*gPtrToInitialize == NULL) // Here, gPtr is correct
{
*gPtrToInitialize = dlcalloc(MAX_PATH, 1);
} // Here, gPtr has trailing junk characters
// Do some initialization
}
void func1()
{
if(global1 == NULL)
{
global1 = dlcalloc(MAX_PATH, 1);
}
func2(global1, &global2);
func2(global1, &global3);
func2(global1, &global4);
// Do other tasks
// Free all allocated global variables
}
注意:
在上面的代码中,dlcalloc
指的是Doug Lea malloc.c中定义的代码。
在calloc
内func2()
,
gPtr
=“C:\ Program Files \ Test \ Path.txt”
calloc
内func2()
后
gPtr
=“C:\ Program Files \ Test \Path.txt♂”
我的问题是,连续的dlcalloc()
次调用是否有可能破坏其他变量的内存?上面的代码是我正在处理的一些大型代码库的一部分的概括。
答案 0 :(得分:1)
好的家伙我刚刚解决了我的问题。这就是func2()
中发生的事情:
gPtr
指向0x009b0038
。strlen("C:\Program Files\Test\Path.txt")
= 30个字节。*gPtrToInitialize
指向0x009b0057
,gPtr
部分结束后完全 。gPtr
指向的字符串没有尾随'\ 0',gPtr
上的任何字符串操作实际上都会进入*gPtrToInitialize
的内存。当我只添加一个尾随'\0'
时,所有这些都解决了。
感谢您的所有答案!
答案 1 :(得分:0)
我认为你应该看一下你对指针的使用,因为在上面的代码中你将global2,global3和global4的地址传递给func2。这些地址永远不应为null,因此永远不应该在func2中调用dlcalloc。
我怀疑func2应该是这样的:
void func2(char *gPtr, char **gPtrToInitialize)
{
if(*gPtrToInitialize == NULL) // Here, gPtr is correct
{
*gPtrToInitialize = dlcalloc(MAX_PATH, 1);
} // Here, gPtr has trailing junk characters
// Do some initialization
}
我会在代码的其他地方查找类似的指针错误,这些错误更可能导致内存损坏。
C指针很危险。