Trang 3 trên tổng số 3 Đầu tiênĐầu tiên 123
Từ 21 tới 21 trên tổng số 21 kết quả

Đề tài: Hàm trả về con trỏ sau có đúng không?

  1. #21
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Mặc định Hàm trả về con trỏ sau có đúng không?

    C Code:
    1. int main(){
    2.   int *a[10];
    3.   func(a,2,3);
    4. }
    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Ý mình nói là ngoài hàm func(), i và j không tồn tại, nên a[0] bất định hay nói cách khác, nó trỏ vào rác. Dùng số (2, 3) chỉ để thấy rõ hơn là i, j không tồn tại trong hàm main() mà thôi.
    Nói thêm về chỗ "không tồn tại". Một cách chính thức thì không có chuyện "tồn tại" hay "không tồn tại", mà chỉ có chuyện sống hay không sống (W. Shakespeare). Bởi vì chúng ta vẫn có thể sử dụng cái "xác chết" của một biến hay thậm chí là "xác sống", tức "xác chết" nhưng đã có biến khác "nhập hồn". Việc đó tuy nhiên không hứa hẹn kết quả nào tốt đẹp và thật ra, không hứa hẹn bất cứ cái gì. Nói theo đúng luật [ISO/IEC 9899], tham số i, j, cũng như mọi tham số của mọi hàm, có thời gian nhớ là automatic (6.9.1 (9)). Thời gian nhớ xác định thời gian sống (6.2.4 (1)) và, trong trường hợp cụ thể này, thời gian sống của i, j kéo dài từ thời gian kích hoạt đến khi chấm dứt thi hành hàm func() (6.2.4 (5)). Cố gắng dùng đối tượng sau thời gian sống là hành tung bất định (6.2.4 (2)). Nói riêng, cố gắng đọc, ghi tham i, j trong hàm main() bằng **a (hay *a[0], a[0][0]) là hành tung bất định.

    Nói thêm, chọn dùng cách nào để truyền tham số (stack, thanh ghi, v.v.) là chi tiết thực thi, chuẩn không chỉ định (6.9.1 (9)). Dựa vào định nghĩa đó, lời gọi func(a,2,3) có thể cài đặt đại khái như sau, bằng giả mã [đích]:

    Code:
    PUSH 3
    PUSH 2
    LOAD I, a
    CALL func
    POP int
    POP int
    Trong đó, I là một thanh ghi chỉ số, dùng để truyền tham hình thức pptr (tham thực tế a). Các tham i, j không thể truyền qua thanh ghi, do toán tử &i&j trong hàm func() đòi hỏi chúng phải có địa chỉ. Tham pptr (tức a) cũng có thể truyền bằng stack và, nếu phần cứng cho phép, việc giải phóng stack (các POP) cũng có thể thực hiện bởi mã [đích] của hàm func(), thay vì hàm main(). (Hỗ trợ từ phần cứng là thiết yếu nếu máy chỉ có 1 stack và lệnh CALL cũng ngầm PUSH gì đó lên stack duy nhất này.)
    Đã được chỉnh sửa lần cuối bởi Ada : 23-09-2021 lúc 07:56 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn