30/09/2018, 20:46

Cấp phát động mảng 2 chiều không được

#include <stdio.h>
#include <stdlib.h>

void capPhat(int **a, int dong, int cot){
	a = new int* [dong];
	for (int i = 0; i < dong; i++)
		a[i] = new int [cot];
}

void thuHoi(int **a, int dong, int cot){
	for (int i = 0; i < dong; i++){
		delete[] a[i];
	}
	delete[] a;
}

void nhapM(int **a, int dong, int cot){
	for (int i = 0; i < dong; i++)
		for (int j = 0; j < cot; j++){
			printf("Nhap phan tu thu [%d][%d]: ", i,j);
			scanf("%d",&a[i][j]);
		}
}

void xuatM(int **a, int dong, int cot){
	for (int i = 0; i < dong; i++){
		for (int j = 0; j < cot; j++)
			printf("%d",a[i][j]);
		printf("
");
	}
}

int main(){
	int **a, dong, cot;
	printf("Nhap so dong: ");
	scanf("%d",&dong);
	printf("Nhap so cot: ");
	scanf("%d",&cot);

	capPhat(a,dong,cot);
	printf("%d",sizeof(a));

	nhapM(a,dong,cot);
	xuatM(a,dong,cot);

	thuHoi(a,dong,cot);
	return 0;
}

Mình đã kiểm tra nhiều lần nhưng không biết sai ở đâu mà code chạy không được.Mọi người xem giúp.

Người bí ẩn viết 23:00 ngày 30/09/2018

Sửa lại nhé. Markdown không hết code

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

phải truyền tham chiếu (reference) hay truyền đích thị con trỏ a vô hàm capPhat.

thêm có 1 ký tự & phía trước a thôi:
void capPhat(int ** &a, int dong, int cot)

cách viết cũ thì a truyền vào capPhat là bản sao của con trỏ a trong main. Thêm dấu & thì mới truyền bản chính.

Kudo Vĩ viết 22:49 ngày 30/09/2018

Cảm ơn. Nhưng ban có thể giải thích cụ thể giùm mình được không? Mình nghỉ nó đã là con trỏ sẳn rồi nên không cần dấu ‘&’ nữa chứ.

viết 22:47 ngày 30/09/2018

kiểu của aint **, bạn xem int ** như là 1 kiểu ví dụ ppInt vậy. Nếu vậy thì void capPhat(int **a, ... tương đương với void capPhat(ppInt a, .... Nhưng trong hàm capPhat thì a lại được gán a = new ... nên giá trị của a thay đổi nên a cần phải truyền theo tham chiếu: void capPhat(ppInt& a, ...

ví dụ hàm void nhanHai(double x) { x = 2*x; } thì x cũng được gán x = ... nhưng x ko được truyền tham chiếu nên gọi nhanHai(a) trong main thì a vẫn chứa giá trị cũ. Phải truyền tham chiếu double& x thì mới thay đổi giá trị của a được (cái này chắc bạn thừa biết rồi). Con trỏ cũng tương tự thôi.

Phạm Ngọc viết 22:50 ngày 30/09/2018

int **capPhat(int ,int) thi hay hon.

Phạm Ngọc viết 22:55 ngày 30/09/2018

Chay debug neu ban biet.

Bài liên quan
0