2013-04-25 20 views
10

Có thể ai đó vui lòng cho tôi biết nếu sử dụng cùng nhãn goto trong các chức năng khác nhau trong cùng một tệp C không?Các nhãn goto tương tự được sử dụng trong tệp C nhưng các chức năng khác nhau

Để giải thích những gì tôi đang phải đối mặt:

function1() 
{ 
    ... 

    goto label 

    ... 

label: 
    ... 
} 

function2() 
{ 
    ... 

    goto label; 

    ... 

label: 
    ... 
} 

Bây giờ whats xảy ra là các mã sau khi nhãn đang được sử dụng cho dọn dẹp của malloc'ed' dữ liệu. Và toàn bộ sự việc đang rơi vào hàm 2. Tôi in ra mem. các địa điểm đang được miễn phí và tương tự đang được giải phóng nhiều lần. Đây có phải là vì tất cả các gotos? Đây có phải là việc sử dụng hợp lệ câu lệnh goto không?

+1

Định dạng câu hỏi của bạn đúng cách, vui lòng. – Alex

+0

cố gắng đăng một số mã để nhận sự cố thực tế ... – akp

+0

Bạn có thể có cùng tên nhãn trong các chức năng khác nhau nhưng bạn không thể sử dụng * nhãn nằm trong chức năng khác. Sự cố của bạn không liên quan đến tên nhãn đang được sử dụng lại. Có cái gì khác sai trong mã của bạn mà nguyên nhân đôi miễn phí. –

Trả lời

15

Nhãn là địa phương, vì vậy bạn có thể sử dụng cùng một nhãn trong nhiều chức năng.

Câu hỏi về việc bạn có nên sử dụng goto hay không là một vấn đề khác và câu hỏi không dễ trả lời. Tóm lại, không sử dụng goto. Nhưng như với tất cả mọi thứ (đặc biệt là khi nói đến lập trình) có những ngoại lệ, nơi goto có thể hữu ích.

+8

Và việc sử dụng goto để dọn dẹp có xu hướng là một trong số chúng. – Medinoc

+1

goto được sử dụng rất thường xuyên khi xây dựng/teardown phức tạp (ví dụ: hạt nhân Linux) và các điều kiện thoát khác nhau sẽ sử dụng lại mã từ những người khác (ví dụ: phân bổ/giải phóng tài nguyên). Trong những trường hợp này, sử dụng goto là sạch hơn và đảm bảo rằng cơ chế thu gọn sẽ thực thi chính xác cùng một trình tự trên các giai đoạn khác nhau của tear-down. –

5

Như Joachim đã nói ở đây, nhãn là địa phương; nhưng lưu ý rằng các nhãn là cục bộ cho các hàm - không phải cho khối hiện tại. Các câu hỏi goto không tôn trọng phạm vi, ngoại trừ phạm vi toàn chức năng.

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