我对目前正在学习的 C 编程、调试和一般编程非常陌生。对于分配,在尝试使用使用我创建的链表的函数时,我遇到了一些未定义的行为。具体来说,在我尝试访问节点之后,节点将“消失”,并且在将用户输入的值与存储在列表中的值进行比较时,它仅适用于某些函数或某些值。我相信我有一个导致这种情况的内存泄漏,所以我通过 valgrind 运行我的程序并立即完成了这个泄漏摘要:
==17339==
==17339== HEAP SUMMARY:
==17339== in use at exit: 336 bytes in 6 blocks
==17339== total heap usage: 16 allocs, 10 frees, 1,723 bytes allocated
==17339==
==17339== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==17339== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-
linux.so)
==17339== by 0x402972: system_init (tm_utility.c:41)
==17339== by 0x400AC0: main (tm.c:50)
==17339==
==17339== 320 bytes in 5 blocks are definitely lost in loss record 2 of 2
==17339== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-
linux.so)
==17339== by 0x401FC6: populate_stock_list (tm_stock.c:44)
==17339== by 0x402CB6: load_data (tm_utility.c:122)
==17339== by 0x400AEF: main (tm.c:57)
==17339==
==17339== LEAK SUMMARY:
==17339== definitely lost: 336 bytes in 6 blocks
==17339== indirectly lost: 0 bytes in 0 blocks
==17339== possibly lost: 0 bytes in 0 blocks
==17339== still reachable: 0 bytes in 0 blocks
==17339== suppressed: 0 bytes in 0 blocks
==17339==
这是我列表的结构:
typedef struct stock_list * stock_list_ptr;
typedef struct coin * coin_list_ptr;
typedef struct tm {
coin_list_ptr coins;
stock_list_ptr stock;
} tm_type;
struct stock_data
{
char ticket_name[TICKET_NAME_LEN+1];
char ticket_type;
char ticket_zone[TICKET_ZONE_LEN+1];
unsigned int ticket_price;
unsigned int stock_level;
};
typedef struct stock_node
{
struct stock_data * data;
struct stock_node * next_node;
} stock_node;
struct stock_list
{
stock_node * head_stock;
unsigned int num_stock_items;
};
以下是发生内存丢失的函数:
BOOLEAN system_init(tm_type * tm)
{
if((tm->coins=malloc(sizeof(struct coin) * NUM_COINS)) == NULL) {
return FALSE;
}
memset(tm->coins, 0, (sizeof(struct coin)*NUM_COINS));
if((tm->stock=malloc(sizeof(struct stock_list))) == NULL) {
return FALSE;
}
tm->stock->head_stock = NULL;
tm->stock->num_stock_items =0;
return TRUE;
}
BOOLEAN populate_stock_list(tm_type *tm, char *ticket_name, char ticket_type,
char *ticket_zone, unsigned int ticket_price,
unsigned int stock_level, unsigned int stock_count)
{
stock_node *new_node;
if(tm->stock == NULL) {
return FALSE;
}
if((new_node = malloc(sizeof(stock_node))) == NULL) {
return FALSE;
}
new_node->data = malloc(sizeof(struct stock_data));
strcpy(new_node->data->ticket_name, ticket_name);
new_node->data->ticket_type = ticket_type;
strcpy(new_node->data->ticket_zone , ticket_zone);
new_node->data->ticket_price = ticket_price;
new_node->data->stock_level = stock_level;
new_node->next_node = tm->stock->head_stock;
tm->stock->head_stock = new_node;
tm->stock->num_stock_items = stock_count;
return TRUE;
}
谁能向我解释为什么我在这里漏水?是不是因为内存不在程序中的其他地方,所以当函数结束时它会丢失?谢谢!