Cấp phát bộ nhớ động trong C : Malloc hay Calloc

Mọi người cho em hỏi về hàm malloc cụ thể của code này:

  1. main()
  2. {
  3. char *ten;
  4. ten = malloc(1);
  5. gets(ten);
  6. }

malloc(1) được cấp phát 1 byte bộ nhớ, kiểu char có kích thước 1 byte. Nhưng em có thể nhập được rất nhiều kí tự: khoảng hơn 200 kí tự. Ai giải thích giúp em với :confused:

Nhiều khi thực nhận từ heap là mấy trăm byte ấy chứ không phải 1 byte. Còn mảng tĩnh mà nhập vậy là hỏng hết.

1 Like

em vẫn chưa thông cho lắm. Em muốn hỏi tại sao nó chỉ được cấp 1 byte để dùng mà nó lại chứa được rất nhiều ký tự char ấy :confused:

mấy hôm trước em học lập trình thread basic trên youtube: thì học đc khởi tạo vùng nhớ khá bất ngờ em còn tưởng là sai nhưng ôi trời ơi đó là đúng struct SinhVien* sv = malloc(*sv); em còn dựt mình! Ngườí đó giải thích = tiếng anh em chưa hiểu lắm! Anh nào có thể giải thích giúp em không?

Cái này là nội vụ (internal) của C :slight_smile: bạn tìm malloc implementation nhé.

Bạn xem lại xem có thiếu từ gì không đã.

ok anh em thiếu sizeof(*sv) đây là link: https://youtu.be/KVF4kYvd7e8?t=2m37s

struct Sinhvien *sv;
thì sv thực chất chỉ là một biến(con trỏ chứa biến dạng cấu trúc).
Hàm malloc cung cấp cho con trỏ sv một lượng bộ nhớ bằng độ lớn của cả cấu trúc sv đó.

Em tán thành với ý kiến của anh! sài printf, scanf thật là hack não người học …

em muốn có một chương trình kiểu kệ cha người dùng nhập bao nhiêu phần tử trong mảng mà không muốn ước lượng số phần tử, thì dùng mảng động có đc không và dùng ntn, như trên thì hình như phải biết số phần tử

1 Like

Không hẳn, tùy vào HĐH nữa. Linux nó lazy cho 1 page toàn zero, tức là khi viết vào đó sẽ bị văng lỗi và lúc này mới được cấp mem thật sự (gọi là overcommit).

https://www.etalabs.net/overcommit.html

Bạn cmt cấu trúc C++ vào topic về C làm gì?

1 Like

calloc có thể xem là an toàn hơn ở một điểm: kích cỡ của ô nhớ và số ô nhớ là hai tham số khác nhau :slight_smile:

Ngày xưa khi còn chạy DOS, bộ nhớ hạn hẹp nên người ta phải tối ưu bộ nhớ bằng malloc/calloc.
Giờ máy bèo bèo cũng 4GB, trung bình cũng 8GB chưa kể vùng swap. Nhiều ngôn ngữ lập trình như php/javascript còn . . . chả quan tâm đến vấn đề ít hay nhiều memory.

Nhưng lâu lâu nghe lại cũng vui (y) !

PHP vẫn care bác nhé, điển hình như một số thay đổi của yield, foreach,…
Có thằng Python/Ruby/JS là mất dạy nhất thôi. Thằng Java có khi cũng không kém cạnh, cứ kêu byte code nhưng ăn hết cả ram nhà người ta :))

2 Likes

Cho mình hỏi , ở C++ thì cấp phát xong thì có hàm delete [] , còn cái này muốn xóa thì làm như thế nào ạ

Dùng free() nhé bạn.

int n = 0;
do {
  printf("Enter size of array: ");
  scanf("%d", &n);
  if (n <= 0)
    printf("\nSize of array must be greater than 0\n");
} while (n <= 0);
int *arr = malloc(n * sizeof(int));

// todo

free(arr);
2 Likes

Cấp phát để biết địa chỉ mình cần truy xuất tới

Cho mình hỏi cú pháp báo của nó.
malloc(n * sizeof(int)) và (int*)malloc(n * sizeof(int))
hai thằng này nó khác nhau như thế nào vậy bạn

malloc(n * sizeof(int)) của C
(int*)malloc(n * sizeof(int)) do C++ ko cho phép cast ngầm định void* thành int*, phải cast tường minh nên mới viết thêm (int*) vào. Code C muốn compile bằng C++ compiler thì phải viết như thế này ko nó la làng ko cho.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?