30/09/2018, 18:32

Thắc mắc về malloc và free trong C

Tôi có đoạn code về malloc như sau:

#include <stdio.h>

int main(){
	int* a = (int*)malloc(sizeof(int));
	int b;

	for(b = 0; b < 10; b++){
		printf("Enter value of a[%d]
", b);
		scanf("%d", &a[b]);
	}
	for(b = 0; b < 10; b++){
		printf("a[%d] = %d
", b, a[b]);
	}
        free(a);
	return 0;
}

Như đoạn code trên. Tôi sử dụng 1 biến malloc và có thể khai báo cũng như xuất ra màn hình giá trị của a.
Vậy thì tại sao lại phải dùng

int n = ...;
int* a = (int*)malloc(n * sizeof(int));

Mong các bạn sớm giải đáp thắc mắc này giúp tôi! Xin cảm ơn.

viết 20:48 ngày 30/09/2018

malloc(sizeof(int)) tức là chỉ lấy chỗ cho 1 số nguyên. Còn malloc(n * sizeof(int)); là lấy chỗ cho n số nguyên. Nếu chỉ lấy chỗ cho 1 số nguyên thì khi truy cập a[1], a[2], … thì bạn đã truy cập tới vùng nhớ ko phải được cấp phát cho bạn, nhu vậy có thể gây ra lỗi bất kì lúc nào, hoặc ko gây ra lỗi nào cả.

ví dụ bạn vào 1 nhà hàng, đặt 1 bàn 4 ghế. Nhưng nhóm của bạn lại lên tới 40 người. Như vậy bạn phải “xài đỡ” 9 bàn liền sau bàn bạn đặt trong nhà hàng. 9 bàn này trống hay là có người đang xài thì ko biết. Nếu hên 9 bàn đều trống và nhà hàng ko phát hiện ra thì ko có lỗi, còn phát hiện ra hoặc có nhóm khác đang xài 9 bàn này thì bị lỗi ngay.

Bài liên quan
0