Bạn đang đọc sai.
Nếu hàm được gọi là setjmp() trả về trước longjmp() được gọi, hành vi không xác định.
Hành vi của longjmp
là undefined nếu bạn gọi nó sau bạn trở về từ các chức năng mà thiết lập các setjmp
. Nhưng hoàn toàn đúng, không phải không phải để gọi số longjmp
.
Wikipedia là rõ ràng hơn:
Nếu chức năng trong đó setjmp được gọi trở lại, nó không còn có thể sử dụng một cách an toàn longjmp với đối tượng jmp_buf tương ứng.
Điều này là do khung ngăn xếp không hợp lệ khi hàm trả về. Gọi longjmp khôi phục con trỏ ngăn xếp, bởi vì hàm trả về — sẽ trỏ đến khung ngăn xếp không tồn tại và có khả năng bị ghi đè hoặc bị hỏng.
Các chức năng đó thường được sử dụng để xử lý các cơ chế ngoại lệ. Nếu ngoại lệ không xảy ra, bạn không muốn gọi số longjmp
vì không có lý do gì để "tua lại" chương trình của bạn.
Nguồn
2017-12-23 20:51:36