30/09/2018, 16:40

Cấp phát động trong C?

Câu hỏi của thầy em đặt ra và em cũng chưa tìm được câu trả lời cho bài này
Mong mọi người giúp đỡ.
Tại sao đoạn code trên lại không báo lỗi .

Cảm ơn mọi người đã xem topic của mình
Học

... viết 18:41 ngày 30/09/2018

Vì sizeof(char*) là một số nguyên không âm.
thử printf nó ra coi giá trị của nó là bao nhiêu.

Gió viết 18:50 ngày 30/09/2018

Thực ra kích thước của con trỏ là giống nhau: sizeof(char * ) = sizeof(int * * ) = sizeof( void * ) … Nó là giá trị trỏ đến bộ nhớ nên phụ thuộc vào hệ điều hành của bạn. Vd hệ điều hành 32bit thì nó sẽ dành 32bit để lưu địa chỉ con trỏ. Như thế khi malloc(sizeof(char * )) có thể hệ điều hành của bạn là 32bit , tương đương malloc( 4byte) cho vùng nhớ mà c trỏ đến.

Thai Hoc Nguyen viết 18:56 ngày 30/09/2018

tớ không chắc do tớ cũng đã thử sizeof(char)) thì chương trình trên chạy vẫn ổn không biết tại sao ??

Tran Huan viết 18:41 ngày 30/09/2018

Nếu bạn cấp phát sizeof(char) thường là 1, tức là ứng dụng của bạn đang truy xuất ra bên ngoài vùng nhớ mà nó cấp phát, có thể sẽ không xảy ra lỗi access violation lúc này, tuy nhiên việc truy xuất ra bên ngoài vùng nhớ này rất nguy hiểm có thể gây crash ứng dụng hoặc tệ hơn là gây ra lỗi rất khó xác định do việc ghi đè dữ liệu lên vùng nhớ khác.

Kết luận: việc cấp phát nhưng lại truy xuất ra bên ngoài vùng nhớ đã cấp phát không nhất thiết làm ứng dụng bị lỗi lúc runtime, thay vào đó có thể dẫn đến những kết quả không ngờ tới. Vì vậy việc cẩn thận trong việc cấp phát và sử dụng bộ nhớ là rất quan trọng!

Bài liên quan
0