Phần nhập số phần tử không nhập được số 1,000,000 trong khi miền giá trị của int là -2,147,483,648 tới 2,147,483,647?

#include <stdio.h>

void array_input(float a[], int n);

int main(){
	int n;
	do{
		system("cls");
		printf("Nhap so phan tu cua mang: ");
		scanf("%d", &n);
	}while(n <= 0);
	
	float a[n];
	
	array_input(a, n);
	
	return 0;
}

void array_input(float a[], int n){
	int i = 0;	
	for(; i < n; i++){
		printf("a[%d] = ", i);
		scanf("%d", &a[i]);
	}
	return;
}

Không hiểu sao nhập số phần tử nhập số nhỏ thì được, mà nhập số to như 1,000,000 thì chương trình bị crash.

E đã kiểm tra miền giá trị của int trong trình biên dịch DEV C++ rồi.
Số 1 triệu trong khoảng của miền giá trị mà chương trình vẫn bị crash.

Các cao nhân đi qua cho e xin câu trả lời với ạ <3

Tràn stack thôi bạn. Nếu muốn khai báo 1 lượng lớn mem thì nên alloc trên heap

5 Likes

e chưa hiểu rõ lắm. bác giải thích kỹ hơn giúp e để e hiểu vấn đề được k ạ
<3

Do chỗ này đây bạn.

Bạn nhập n = 1 triệu -> mảng a sẽ có 1 triệu phần tử, vị chi tốn 4 byte * 1 triệu = 4 triệu byte = 3.81MB bộ nhớ. Mà bạn khai báo mảng tĩnh (float a[n]) trong hàm, bộ nhớ stack lại nhỏ (mặc định chỉ vài KB) nên tràn stack.

Giải pháp là bạn chuyển sang cấp phát động mảng a.

3 Likes

Cảm ơn bác đã nhiệt tình trả lời.
Share 2be shared.
E sẽ nghiên cứu vấn đề này.
Mong rằng bác có thể chỉ cho e học liệu hữu ích về phần này cũng như ngôn ngữ lập trình C

1 Like

Cấp phát động là dùng calloc() hay malloc() hả bạn.
Lý do phải dùng hàm này với số lượng phần tử lớn mk vẫn chưa hiểu.
Bạn giải thích rõ giúp mk dk k.
Cảm ơn bạn trước <3

Stack là bộ nhớ được cấp phát cố định. Mục đích dùng cục bộ và tạm thời.
Kiểu như cha kêu đi mua 1 lít rượu và đưa cho bạn chai 2 lít, bạn có thể mua thêm 1 lít nhưng mua nhiều hơn thì không được. Còn nếu thực sự muốn mua nhiều hơn, hoặc mua thêm mật ong,… bạn tự kiếm chai khác (malloc, calloc).

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