Đố vui[C++]

HustReMw

VIP Members
20/12/2016
251
544 bài viết
Đố vui[C++]
Câu hỏi: Tìm lỗi, giải thích rõ bản chất lỗi và đưa ra hướng giải pháp?

int _tmain(int argc, _TCHAR* argv[])
{
LPCTSTR pszDisk = L"C:\\";
ULARGE_INTEGER lpFreeBytesAvailable;
ULARGE_INTEGER lpTotalNumberOfBytes;
ULARGE_INTEGER lpTotalNumberOfFreeBytes;

GetDiskFreeSpaceEx(pszDisk,&lpFreeBytesAvailable,&lpTotalNumberOfBytes,&lpTotalNumberOfFreeBytes);
printf("Available: %u, Free: %u\n", (lpFreeBytesAvailable.QuadPart / (1024 * 1024 * 1024)), (lpTotalNumberOfFreeBytes.QuadPart / (1024 * 1024 * 1024)));
system("pause");
return 0;
}
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Code khó nhìn quá mode ơi :(
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
QUADPART là kiểu ulonglong nên chỗ printf phải chỉ định in ra ULONGLONG tương ứng chứ không in ra %u được vì có 4 byte thôi, còn ULONGLONG = 8 byte. Sửa lại như này chắc ok rồi.

Mã:
printf("Available: %llu, Free: %llu\n", (lpFreeBytesAvailable.QuadPart / (1024 * 1024 * 1024)), (lpTotalNumberOfFreeBytes.QuadPart / (1024 * 1024 * 1024)));
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
QUADPART là kiểu ulonglong nên chỗ printf phải chỉ định in ra ULONGLONG tương ứng chứ không in ra %u được vì có 4 byte thôi, còn ULONGLONG = 8 byte. Sửa lại như này chắc ok rồi.

Mã:
printf("Available: %llu, Free: %llu\n", (lpFreeBytesAvailable.QuadPart / (1024 * 1024 * 1024)), (lpTotalNumberOfFreeBytes.QuadPart / (1024 * 1024 * 1024)));
Chuẩn rồi bạn :D. Free: %u\n nó bằng bao nhiêu và tại sao bạn?
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Chuẩn rồi bạn :D. Free: %u\n nó bằng bao nhiêu và tại sao bạn?

nó bằng 0 hoặc ra một giá trị sai, thực ra thì giá trị nó vẫn tính đúng chỉ khác mỗi phần in thì nó chỉ tính 4 byte thay vì 8 byte thôi. Mà như code trên thì nó nhảy địa chỉ kiểu, cái tham số đầu tiên là 8 byte rồi, nhưng 2 cái %u nên là nó in ra một nửa của 8 byte đấy 2 lần chứ không đụng đến cái tham số cuối cùng
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: HustReMw
Comment
Bên trên