Tôi đang cố gắng tìm hiểu C và tôi hiện đang cố gắng viết cấu trúc dữ liệu ngăn xếp cơ bản, nhưng tôi dường như không thể nhận được quyền cơ bản malloc
/free
.Bộ nhớ miễn phí được cấp phát trong một chức năng khác?
Dưới đây là đoạn code tôi đã sử dụng (tôi chỉ đăng một phần nhỏ vào đây để minh họa cho một vấn đề cụ thể, chứ không phải tổng mã, nhưng được thông báo lỗi được tạo ra chỉ bằng cách chạy mã ví dụ này trong valgrind
)
#include <stdio.h>
#include <stdlib.h>
typedef struct Entry {
struct Entry *previous;
int value;
} Entry;
void destroyEntry(Entry entry);
int main(int argc, char *argv[])
{
Entry* apple;
apple = malloc(sizeof(Entry));
destroyEntry(*(apple));
return 0;
}
void destroyEntry(Entry entry)
{
Entry *entry_ptr = &entry;
free(entry_ptr);
return;
}
Khi tôi chạy nó thông qua valgrind
với --leak-check=full --track-origins=yes
, tôi nhận được lỗi sau:
==20674== Invalid free()/delete/delete[]/realloc()
==20674== at 0x4028E58: free (vg_replace_malloc.c:427)
==20674== by 0x80485B2: destroyEntry (testing.c:53)
==20674== by 0x8048477: main (testing.c:26)
==20674== Address 0xbecc0070 is on thread 1's stack
tôi nghĩ rằng lỗi này có nghĩa là chức năng destroyEntry
không được phép sửa đổi al bộ nhớ đặt rõ ràng trong chính. Có đúng không? Tại sao tôi không thể chỉ cần free
bộ nhớ mà tôi đã phân bổ trong main
trong một chức năng khác? (và là hành vi này bằng cách nào đó cụ thể cho chính?)
+1 cho câu hỏi rõ ràng và SSCCE. –
@MatteoItalia Tôi chưa bao giờ nghe nói về [SSCCE] (http://sscce.org/) trước đây. Chắc chắn là một khái niệm tốt. Cảm ơn đã giới thiệu tôi với nó. –
Gọi theo giá trị ??? –