2010-10-27 31 views
19

Lỗi báo cáo valgrind Invalid read of size 8 trong mã sau.Đọc không hợp lệ kích thước 8 - Valgrind + C

Tôi có một mảng được khai báo như thế nào,

struct symbol *st[PARSER_HASH_SIZE]; 

Khi chương trình của tôi được khởi tạo, tất cả các yếu tố trong mảng này được initailzied như 0.

memset(&st[0], 0, sizeof(st)); 

chương trình của tôi tạo ra các trường hợp struct symbol và chèn vào mảng trên tùy thuộc vào giá trị băm. Vì vậy, rất ít các phần tử trong mảng này sẽ là NULL và các phần tử khác sẽ là giá trị hợp lệ.

Các mã sau cố gắng để xóa các mục được phân bổ và valgrind phàn nàn tại dòng, sym = st[i]; sym != NULL; sym = sym->next

struct symbol *sym = NULL; 

/* cleaning the symbol table entries */ 
for(i = 0; i < PARSER_HASH_SIZE; i++) { 
    for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */ 
     free(sym); 
    } 
} 

Tôi cố gắng để hiểu được lý do cho lỗi này.

Mọi trợ giúp sẽ tuyệt vời!

Trả lời

40

Vấn đề là bạn đang giải phóng sym, sau đó cố gắng truy cập vào một giá trị từ dữ liệu (đã giải phóng): sym->next.

Bạn có thể muốn một cái gì đó như thế này cho các vòng trong:

struct symbol *next_sym = NULL; 

for(sym = st[i]; sym != NULL;) { 
    next_sym = sym->next; 
    free(sym); 
    sym = next_sym; 
} 
3

cũng của nó không rõ ràng nếu bạn mảng có nghĩa là để chứa cấu trúc hoặc con trỏ đến struct

struct symbol *st[PARSER_HASH_SIZE]; 

nói một mảng của con trỏ đến cấu trúc. Nhưng sau đó bạn nói

"Khi chương trình của tôi được khởi chạy, tất cả các phần tử trong mảng này được initailzied là 0."

memset(&st[0], 0, sizeof(st)); 

này được điều trị các mục như struct

để xóa mảng làm

for (int i = 0; i < PARSER_HASH_SIZE; i++) 
{ 
    st[i] = 0; 
} 
+0

Nó có nghĩa là để chứa con trỏ đến cấu trúc. Bạn có thể cho tôi biết cách khởi tạo đúng cách không? –

Các vấn đề liên quan