gpt4 book ai didi

调试/发布时的 C malloc 怪异行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:12:32 25 4
gpt4 key购买 nike

我正在尝试在简单程序中使用 C malloc/free 函数。

void* alloc_array( const int size )
{
void* p;

p = malloc( size );
if( p )
{
//memset(p, 0, size);
return( p );
}
else
return NULL;
}

void free_array( void* p )
{
if( p )
{
free( p );
p = NULL;
}
}

void** alloc_array_ptr( const int nPointers )
{
void** p;
unsigned int size = AMOUNT_TO_ALLOC(nPointers, void*);

p = malloc( size );
if( p )
{
return( p );
}
else
return( NULL );
}

void free_array_ptr( void** p, const int nPointers )
{
unsigned int i;

if( p )
{
for( i = 0; i < nPointers; i++ )
if( p[i] )
{
free( p[i] );
p[i] = NULL;
}

free(p);
p = NULL;
}
}
int main(int argc, char* agv[]) {
// builds the string with the location of the ini file
int inifile_size = 0;
char* inifile;
// gets the buffer size nedeed for the buffer
inifile_size = GetCurrentDirectory(0, NULL);
// allocates memory for the buffer
inifile = (char*) alloc_array( AMOUNT_TO_ALLOC(inifile_size, char) );
// fills the buffer with the current directory
if( GetCurrentDirectory( inifile_size, inifile ) == 0 )
{
printf("GetCurrentDirectory failed! (ErrorCode: %u)\n", GetLastError());
return( !MY_ERROR_OK );
}
strcat(inifile, "\\");
strcat(inifile, "test.ini");
printf("INI File: %s\n", inifile);

char** sessions;
int nSessions = 0;
int i;

nSessions = getNumberOfSubkeys(str);
printf("\nOK (%d sessions found)\n", nSessions);

// allocating memory for the sessions array of char*
sessions = (char**) alloc_array_ptr( nSessions );

if( sessions == NULL )
{
printf("ERROR_IN_MEM_ALLOC (SESSIONS)\n");
return( MY_ERROR_MEM_ALLOC );
}
else
printf("sessions: 0x%p\n", sessions);

// allocating memory for each one of the char* in sessions
for( i = 0; i < nSessions; i++ )
{
sessions[i] = (char*) alloc_array( AMOUNT_TO_ALLOC(MAX_KEY_LENGTH, char) );

printf("sessions[%d]: 0x%p\n", i, sessions[i]);

if( sessions[i] == NULL )
{
printf("ERROR_IN_MEM_ALLOC (SESSIONS[%d])\n", i);
return( MY_ERROR_MEM_ALLOC );
}
}

printf("\nSessions found:\n");

if( readSubkeys( str, sessions ) == MY_ERROR_OK )
{
for( i = 0; i < nSessions; i++ )
{
printf("\t%s: ", sessions[i]);

if( convert2ini(inifile, sessions[i]) == MY_ERROR_OK )
printf("OK\n");
else
{
printf("ERROR\n");
return( !MY_ERROR_OK );
}
}
}
else
{
printf("ERROR\n");
return( MY_ERROR_OPEN_REGISTRY );
}

// free the inifile array
free_array(inifile);

// free the array of char*
free_array_ptr( (void**)sessions, nSessions );

// returns to OS
return( MY_ERROR_OK );
}

这是一个小工具,可以将 windows 注册表中的一些程序设置转换为 ini 文件(Windows7,64 位,4Gb RAM)。

readSubkeys 使用它从 str 中的注册表项获取的 session 名称填充 char* 的预分配 session 数组

getNumberOfSubkeys 返回注册表中给定子项的数量

其余代码与此无关。问题是,当我在 for 循环内为每个 char* 分配内存时,malloc 失败。我正在使用 CodeLite 编写此程序,奇怪的是,当我逐步调试代码时,malloc 不会失败。

这里是程序运行的图像。 running

有人可以给我一些建议吗?

最佳答案

strangely enough malloc does not fail when I'm debugging the code step-by-step.

此语句可能意味着您的代码中其他地方存在内存分配错误,导致此 block (例如 malloc() 调用或断言)失败。如果没有您的更多代码,我们真的没有足够的信息来完全调试它。

关于调试/发布时的 C malloc 怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com