Đi đoạn mã sau:Tại sao bạn chỉ định kích thước khi sử dụng malloc trong C?
int *p = malloc(2 * sizeof *p);
p[0] = 10; //Using the two spaces I
p[1] = 20; //allocated with malloc before.
p[2] = 30; //Using another space that I didn't allocate for.
printf("%d", *(p+1)); //Correctly prints 20
printf("%d", *(p+2)); //Also, correctly prints 30
//although I didn't allocate space for it
Với dòng malloc(2 * sizeof *p)
Tôi đang phân bổ không gian cho hai số nguyên, phải không? Nhưng nếu tôi thêm int
vào vị trí thứ ba, tôi vẫn được phân bổ chính xác và có thể truy xuất được.
Vì vậy, câu hỏi của tôi là, tại sao bạn chỉ định kích thước khi bạn sử dụng malloc
?
Bạn dường như có p chọn [3] vì nó lớn hơn 2 và do đó "ra khỏi phạm vi." Bạn nói đúng, nhưng hãy nhớ rằng bạn phải suy nghĩ theo cách được lập chỉ mục 0, vì vậy trên thực tế, ngay cả p [2] cũng nằm ngoài phạm vi. Nếu bạn đã cấp không gian cho hai int, bạn có thể lấy int bằng cách sử dụng * p (hoặc p [0]) và * (p + 1) (hoặc p [1]), không p [1] và p [2] . – MatrixFrog
Bạn đang ở đó, sai lầm ngu ngốc từ phía tôi. Tôi sẽ chỉnh sửa câu hỏi như không nhầm lẫn ý định ban đầu của nó –
Trên đầu trang của tất cả các câu trả lời điểm tại vấn đề, bạn đã có một segfault đảm bảo trên tay của bạn nếu malloc trả về NULL, mà nó được phép làm. Luôn luôn kiểm tra giá trị trả về của malloc trước khi bạn sử dụng nó. Nếu đó là NULL, trình quản lý bộ nhớ từ chối cấp phát cho bạn nhiều bộ nhớ hơn (thường vì bạn đã yêu cầu quá nhiều hoặc bạn đã sử dụng hết tất cả nó sẵn sàng cung cấp cho bạn). –