2012-10-01 23 views
17

Tôi đang cố gắng giải mã a note dẫn đến thay đổi giữa C99 và C11. Sự thay đổi được đề xuất trong lưu ý rằng kết thúc trong C11 của 6.2.4: 8, cụ thể là:Tuổi thọ của các vật thể tạm thời trong C11 và C99

Một biểu thức phi giá trị trái với cơ cấu hoặc công đoàn loại, nơi cấu hoặc công đoàn có chứa một thành viên với kiểu mảng (bao gồm cả , đệ quy, thành viên của tất cả các cấu trúc và công đoàn chứa) đề cập đến đối tượng có thời lượng lưu trữ tự động và thời gian tồn tại tạm thời. Tuổi thọ của nó bắt đầu khi biểu thức được đánh giá và giá trị ban đầu là là giá trị của biểu thức. Tuổi thọ của nó kết thúc khi việc đánh giá có chứa biểu thức đầy đủ hoặc khai báo đầy đủ kết thúc. Bất kỳ nỗ lực nào để sửa đổi đối tượng có kết quả tạm thời trong hành vi chưa được thực hiện.

Tôi hiểu lý do tại sao thay đổi là cần thiết (một số cuộc thảo luận có thể được tìm thấy here. Lưu ý rằng cuộc thảo luận quay lại trước C11). Tuy nhiên, những gì tôi không hiểu là một nhận xét bên đó Clark Nelson lập thành văn bản lưu ý của mình:

Xin lưu ý rằng phương pháp này bổ sung tuyên bố một ví dụ như này, được phù hợp dưới C99, là phi phù hợp:

struct X { int a[5]; } f(); 
int *p = f().a; 
printf("%p\n", p); 

tôi hiểu tại sao ví dụ này là không phù hợp dưới C11. Những gì tôi đặc biệt không hiểu là làm thế nào nó là phù hợp theo C99. Và, nếu nó được xác định theo C99, thì nó phải làm gì sau đó, xác định in giá trị của một con trỏ lơ lửng?

+0

Tôi không hiểu cách NON không tuân thủ theo C99 hoặc C11, vì nó không cố gắng sửa đổi đối tượng có tuổi thọ tạm thời hoặc truy cập nó sau khi hết thời gian tồn tại. Giá trị chính xác của con trỏ nó in rõ ràng là không rõ, nhưng nó sẽ in một số giá trị con trỏ. –

+1

@ChrisDodd Lý do nó không được xác định trong C11 là nó trái ngược 6.2.4: 2, cụ thể là "Giá trị của một con trỏ trở thành không xác định khi đối tượng nó trỏ đến (hoặc chỉ vừa qua) đến hết tuổi thọ của nó." Đó là hành vi không xác định về mặt đạo đức để truy cập các nội dung không xác định (nó được liệt kê như trong J.2: “Giá trị của một con trỏ tới đối tượng có thời gian kết thúc được sử dụng (6.2.4)”, mặc dù mơ hồ hơn). C99 rất giống với khía cạnh đó. Sự khác biệt duy nhất tôi thấy là p không ** trở thành không xác định bởi vì nó không bao giờ được xác định. –

Trả lời

7

Sự hiểu biết của tôi là trong C99, hạt thời gian sống tốt nhất cho một đối tượng là khối. Do đó, trong khi 6.5.2.2 (và một số khác được đề cập trong ghi chú mà bạn đề cập) cụ thể nói rằng bạn không thể truy cập giá trị trả về sau điểm chuỗi tiếp theo, về mặt kỹ thuật, địa chỉ của nó là không phải là không xác định cho đến sau khi bạn rời khỏi kèm theo khối (lý do tại sao bạn nên có một số lưu trữ dành riêng cho một đối tượng không thể tiếp cận là trái như là một tập thể dục cho người đọc, mặc dù). Do đó, giống như

struct X { int a[5]; } f(); 
int *p; 
{ p = f().a; } 
printf("%p\n", p); 

không được xác định trong C99 cũng như trong C11. Trong C11, khái niệm "tuổi thọ tạm thời", mà không tồn tại trong C99, cho phép xem xét rằng con trỏ trở nên không xác định ngay sau khi biểu thức đầy đủ kết thúc.

+0

"hạt tốt nhất của đời cho một đối tượng là khối" Đồng ý, cho các đối tượng có thời gian lưu trữ tự động (C99 6.2.4: 5) –

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