JavaScript is required

What will be output of following program? #include #include int main() { int a = 10; void *p = &a int *ptr = p; printf("%u\n", *ptr); getch(); }

A.

int a = 10;

B.

void *p = &a

C.

int *ptr = p;

D.

printf("%u\n", *ptr);

Trả lời:

Đáp án đúng: C


Đoạn chương trình C này có một lỗi nghiêm trọng: gán một con trỏ `void*` cho một con trỏ `int*` mà không ép kiểu tường minh. Điều này dẫn đến hành vi không xác định. Trong C, một con trỏ `void*` có thể trỏ đến bất kỳ kiểu dữ liệu nào. Tuy nhiên, khi bạn gán nó cho một con trỏ kiểu khác (như `int*` trong trường hợp này), trình biên dịch cần biết kiểu dữ liệu mà con trỏ đang trỏ tới để có thể thực hiện các phép toán chính xác trên bộ nhớ. Nếu không có ép kiểu, trình biên dịch sẽ không biết cách giải thích dữ liệu tại địa chỉ mà con trỏ trỏ tới, và kết quả sẽ không thể đoán trước được. Trong trường hợp này, `p` là một con trỏ `void*` trỏ đến địa chỉ của biến `a` (kiểu `int`). Sau đó, bạn cố gắng gán `p` cho `ptr`, là một con trỏ `int*`. Vì không có ép kiểu, trình biên dịch có thể đưa ra cảnh báo (hoặc lỗi, tùy thuộc vào cài đặt trình biên dịch) và chương trình có thể biên dịch, nhưng hành vi khi chạy là không xác định. Hàm `printf` cố gắng in giá trị mà `ptr` trỏ tới bằng định dạng `%u` (unsigned integer). Vì việc gán không hợp lệ, giá trị được in ra là không xác định. Vì vậy, không có đáp án đúng trong các lựa chọn được cung cấp. Chương trình có lỗi và kết quả là không xác định.

Câu hỏi liên quan