Tôi có một đoạn mã mà tôi đang cố gắng trả lại hình vuông của giá trị được trỏ đến bởi *ptr
.Điều gì sai với mã C này
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
main()
{
int a=8,t;
t=square(&a);
printf("%d",t);
}
của nó làm việc tốt cho tôi, nhưng tác giả của mã này cho biết nó có thể không hoạt động vì lý do sau:
Bởi vì nó có thể cho giá trị của *ptr
thay đổi bất ngờ, nó có thể cho a và b là khác nhau. Do đó, mã này có thể trả về một số không phải là hình vuông !. Cách chính xác để làm là
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
Tôi thực sự muốn biết lý do tại sao anh ấy nói như vậy?
Nếu '* ptr' thay đổi giữa chuyển nhượng và chuyển nhượng cho b, kết quả không phải là hình vuông. Tôi không biết điều gì sẽ khiến '* ptr' thay đổi. – Sjoerd
Chỉ có điều mà tôi có thể nghĩ về điều đó trong môi trường đa luồng nội dung của * ptr có thể thay đổi trong một chủ đề khác. Trong trường hợp này, giá trị có thể khác với b. – Totonga
Phiên bản thứ hai của bạn có chữ ký gây hiểu lầm; 'a * a' là' int', và chuyển đổi ẩn thành 'long' đến quá muộn để tăng độ chính xác của giá trị trả về. Để khắc phục điều đó, bạn nên khai báo 'a' là' long'. (Tất nhiên, trên nhiều hệ thống 'long' và' int' là đồng nghĩa.) – ruakh