01/10/2018, 14:36
Dấu * trong dòng lệnh khai báo biến con trỏ dùng cấp phát động
Trong khai báo biến con trỏ dùng malloc; ta thấy có thể viết như sau:
int *p = (int *) malloc (n*sizeof(int *));
(với n là cỡ mảng đã được hỏi & scanf ở bên trên - chắc không cần viết ra)
vấn đề ở: sizeof(int *): chương trình vẫn chạy được, câu hỏi là * thêm vào để làm gì? (dấu * đó thấy ở dòng đầu tiên trang 173 sách C Aptech)
(nhiều người khuyên nên đọc sách Eng nhưng hiện tại trình C & Eng còn thấp nên trước mắt đọc sách Vie trước :D)
Cảm ơn anh/chị đã xem & trả lời.
Bài liên quan
Có phải bạn định viết là
int* p = (int*) malloc(n * sizeof(int*))
?hiện chưa biết cách hiện đúng ý mình cần gõ newbie daynhauhoc mà
Dấu * đó là sách sai rồi không có đâu.
Để hiện code chính xác thì bạn bôi đen rồi bấm vào nút
</>
.nhưng vẫn chạy được đã thử ở BorlandC++5.02 mà
Do kích thước con trỏ thường cố định (và bằng với của int) thôi. Nếu không phải là
int
mà là struct nào đó thì sẽ tràn mem và văng lỗi.Đối số duy nhất là số byte = số phần tử * kích thước (số byte trên) mỗi phần tử.
Tiện đây bác nói thêm về đoạn “kích thước con trỏ thường cố định (và bằng với của int)” được không? Cảm ơn bác nhiều.
Con trỏ là một kiểu dữ liệu.
Chú ý kiểu dữ liệu
int*
khác với kiểu dữ liệuint
Bạn khai báo biến
p
như thế này:int* p = (int*) malloc(n * sizeof(int*))
về lý thuyết là sai. Câu lệnh trên có thể diễn giải như sau: "Khai báo biếnp
có kiểu dữ liệuint*
, khởi tạo biến đó dưới dạng một biến kiểuint*
được cấp phátn
vùng nhớ liền nhau, mỗi vùng nhớ có kích thước của một biếnint*
"May mắn cho bạn, vì biến
int*
vàint
đều chiếm 4 bytes bộ nhớ trong (cứ cho là như thế đi) nên bạn xin một vùng nhớ có kích thướcn * sizeof(int)
hayn * sizeof(int*)
cũng như nhau. Tuy nhiên tình hình có thể khác nếu bạn xin cấp phát vùng nhớ cho kiểudouble*
hay các kiểu dữ liệu khác. Vì mọi con trỏ đều có kích thước 4 bytes (cứ cho là thế) còn các vùng nhớ dữ liệu mà con trỏ trỏ đến có thể khác nhau.