gpt4 book ai didi

c - *** 检测到 glibc *** outfile : free(): invalid pointer: ***

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:21 37 4
gpt4 key购买 nike

当我释放内存时它导致 glibc 检测到错误。 当我给它时它工作正常。(当前目录包含单个文件作为输入)。 但是 ..(父目录)输入给出了这个错误。我曾尝试使用 gdb 但没有成功。 有人可以指出问题吗?谢谢。 下面是代码。

 /*
*********************************************************************
*File Name - function.c
Purpose - Implementation of functions like iteration, open_read to
printf directories and file properties.
**********************************************************************
*/

#include "header.h"


gboolean iterator(GNode* _node, gpointer data)
{
guint _node_depth = g_node_depth(_node);

printf("%p insert _ \t%p data\n",_node,_node->data);

if( _node_depth>1 )
{
printf("%.*s",(_node_depth-2)*2," ");
printf("%s\n",(char *)_node->data);
}
return SUCCESS;
}

gboolean destroyer(GNode* node, gpointer data)
{
printf("\nfrom destroyer: ");
printf("%pnode\t data %p\n",node,node->data);
free(node->data);
return SUCCESS;
}


void open_read( char* input_dir ,GNode* parent)
{
int count = 0;
DIR *dir;
struct dirent *dp;
char *stat_path = NULL;
struct stat file_stat;
char *data = NULL;
char *formatted_data = NULL;

if(NULL == (dir = opendir( input_dir ) ) )
{
printf("cannot open %s directory",input_dir);
}
else
{
/* Loop through directory entries. */
while( (dp = readdir(dir) ) != NULL )
{
if( count >= 2 ) /* omitting '.' and '..' files */
{
if( dp->d_type == DT_REG )
{
/* Get entry's information. */
stat_path = ( char * )malloc( sizeof( char ) * MAX_SIZE );
strcpy( stat_path, input_dir );
strcat( stat_path, dp->d_name );

if ( stat( stat_path, &file_stat) == -1 )
{
printf("cant read the stats of %s",dp->d_name);
}
else
{
data=(char*)malloc(sizeof(char) * MAX_SIZE);
strcpy(data,dp->d_name);
strcat(data,"\n\tLinks\tUid\ti_node\tSize\tPath\n");
formatted_data=(char*)malloc(sizeof(char) * MAX_SIZE);
sprintf(formatted_data,"\t%d\t%d\t%d\t%d\t%s", (int)file_stat.st_nlink, (int)file_stat.st_uid, (int)file_stat.st_ino, (int)file_stat.st_size,input_dir);
strcat(data,formatted_data);
//free(formatted_data);
g_node_insert(parent,-1,g_node_new(data));
}
free(stat_path);
}
else if( dp->d_type == DT_DIR )
{
char *sub_dir = (char *)malloc(sizeof(char) * MAX_SIZE);
strcpy( sub_dir, input_dir );
strcat( sub_dir, dp->d_name);
strcat( sub_dir, "/");
open_read(sub_dir, g_node_insert(parent,-1,g_node_new(dp->d_name)) );
}
}
count++;
}
}
closedir(dir);
}


/**********************************************************************

Purpose - Simulating the LS command
Input - directory path from the command line
Output - Displaying the list of directories and file properties
return - SUCCESS OR FAILURE
***********************************************************************/

#include "header.h"
int main(int argc, char* argv[])
{

char *user_dir = NULL;

/*allocating memory*/
user_dir = (char*)malloc(sizeof(char) * MAX_SIZE);

if (NULL == user_dir)
{
fprintf(stderr, "cant allocate memory...");
return FAILURE;
}

/*opening and reading the directory by calling open_read()*/
if (argc < 2)
{
strcpy(user_dir,"./");
}
else
{
strcpy(user_dir, argv[1]);
strcat(user_dir, "/");
}

GNode * root = g_node_new(user_dir);
//g_node_insert(root);
open_read(user_dir, root);
g_node_traverse(root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, (GNodeTraverseFunc)iterator, NULL);
//printf("from main():%s",root->data);
g_node_traverse(root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, (GNodeTraverseFunc)destroyer, NULL);

g_node_destroy(root);


return SUCCESS;
}

最佳答案

    char *sub_dir = (char *)malloc(sizeof(char) * MAX_SIZE);
strcpy( sub_dir, input_dir );
strcat( sub_dir, dp->d_name);
strcat( sub_dir, "/");
open_read(sub_dir, g_node_insert(parent,-1,g_node_new(dp->d_name)) );

好的,所以你传递给 g_node_new 的是 不是 malloc 返回的,所以你当然不能把它传递给 免费

gboolean destroyer(GNode* node, gpointer data)
{
printf("\nfrom destroyer: ");
printf("%pnode\t data %p\n",node,node->data);
free(node->data);
return SUCCESS;
}

但你知道!

我相信你打算:

    open_read(sub_dir, g_node_insert(parent,-1,g_node_new(sub_dir)) );

关于c - *** 检测到 glibc *** outfile : free(): invalid pointer: ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392573/

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