Vòng lặp bị rơi vào vô hạn trong khi đã có điều kiện

sao vòng lặp của em bị rơi vào vô hạn trong khi đã có điều kiện rồi ạ

#include <stdio.h>
#include <stdlib.h>
#include"struct.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */



int main(int argc, char *argv[]) {
	ThongTin nguoichoi[1];
	int i=0;
	for(i=0; i<=1; i++){
		printf("Thong tin nguoi choi %d ", i+1);
		printf("\nHo:");
		scanf("%s", &nguoichoi[i].ho);
		printf("\nTen:");
		scanf("%s", &nguoichoi[i].ten);
		printf("\nDia chi:");
		getchar();
		fgets(nguoichoi[i].diachi, sizeof nguoichoi[i].diachi, stdin);
		printf("\nTuoi:");
		scanf("%d", &nguoichoi[i].tuoi);
		printf("\ngioi tinh:");
		scanf("%s", &nguoichoi[i].gioitinh);
	}
	for (i=0;i<=1;i++){
		printf("Thong tin nguoi choi %d", i+1);
		printf("%s %s dia chi %s tuoi %d gioi tinh %s", nguoichoi[i].ho,nguoichoi[i].ten,nguoichoi[i].diachi,nguoichoi[i].tuoi,nguoichoi[i].gioitinh);
	}
	return 0;
}

Mình nghĩ bạn thử để i < 1 xem, Do bạn khai báo
ThongTin nguoichoi[1]
Nghĩa là chỉ có 1 phần tử trong mảng kiểu struct ThongTin

  • Lặp lần 1: khi bạn chạy tới i = 0 ==> i <= 1(thỏa) ==> vào abcxyz với nhau :rofl::rofl: xong.

  • Lặp lần 2: khi bạn chạy tới i = 1 ==> i <= 1(thỏa) ==> vào luôn nên nó đíu biết lôi đâu ra phần tử mảng thứ 2 mà chạy. Xong nó lục tung cái máy bạn ra luôn. ĐÙNG CHÍU TOANG MÁY TÍNH. :laughing::laughing:

mình đoán zậy. :laughing::laughing:

chỗ này bạn phải ghi là sizeof(nguoichoi[i].diachi) chứ

2 Likes

Cho hỏi cái nguoichoi[1] là cái nào thế ?

2 Likes

sizeof không cần ngoặc cũng được, nó không phải là hàm. Nhưng để chắc chắc thì nên dùng cặp ngoặc để nhóm.

Nhưng sao bạn lại biết nó lặp vô hạn?
Nếu bạn nhập đến lần thứ 2 thì do điều kiện lặp của bạn sai.
Nếu lặp từ lần thứ 3 trở đi. Xong! Bạn đã vô tình thay đổi giá trị của biến chạy i về số “siêu âm nho nhỏ”.

3 Likes

Trong C không có check về truy cập bộ nhớ do đó nảy sinh vấn đề hại não này. Thuật ngữ chắc bạn nghe nhiều chính là kiểu làm tràn stack của ứng dụng dẫn đến ghi đè bộ nhớ sang vùng nhớ không được phép.
Ở đây do bạn khai báo mảng quá ít mà lại vượt kích thước của mảng sẽ ghi đè dữ liệu lên ô nhớ chứa giá trị của biến i làm cho biến i trở thành 1 giá không xác định (có thể vô cùng lớn) nên làm chương trình chạy mãi không dừng (Thật ra sẽ dừng nhưng có thể lâu đấy)

4 Likes

yep , thanks anh nhiều ạ em hiểu rồi

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