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.

rogp10 viết 16:45 ngày 01/10/2018

Có phải bạn định viết là int* p = (int*) malloc(n * sizeof(int*)) ?

Nam Hải Vũ viết 16:51 ngày 01/10/2018

hiện chưa biết cách hiện đúng ý mình cần gõ newbie daynhauhoc mà

rogp10 viết 16:42 ngày 01/10/2018

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 </>.

Nam Hải Vũ viết 16:48 ngày 01/10/2018

nhưng vẫn chạy được đã thử ở BorlandC++5.02 mà

rogp10 viết 16:52 ngày 01/10/2018

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ử.

Nam Hải Vũ viết 16:51 ngày 01/10/2018

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.

Trần Hoàn viết 16:42 ngày 01/10/2018

kích thước con trỏ thường cố định

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ệu int

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ến p có kiểu dữ liệu int*, khởi tạo biến đó dưới dạng một biến kiểu int* được cấp phát n vùng nhớ liền nhau, mỗi vùng nhớ có kích thước của một biến int*"

May mắn cho bạn, vì biến int*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ước n * sizeof(int) hay n * 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ểu double* 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.

Bài liên quan
0