Bị lỗi khi thêm hàng cho mảng động 2 chiều

Tình hình là em làm bài tập c tới phần thêm hàng cho mảng động 2 chiều thì bị mắc một lỗi runtime không hiểu nguyên nhân, vì vậy nên em làm một chương trình nhỏ để test thử như hình bên dưới, đúng như dự đoán, nó gặp lỗi tương tự

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

void themhang(int**,int*,int);

void xuat(int**,int,int);

int main(){
	int **a,i,j,sohang=3,socot=3;
	a=(int**)malloc(sizeof(int*)*sohang);
	for(i=0;i<sohang;i++)
		a[i]=(int*)malloc(sizeof(int)*socot);
	for(i=0;i<sohang;i++)
		for(j=0;j<socot;j++)
			a[i][j]=3;
	printf("Mang goc:\n");
	xuat(a,sohang,socot);
	themhang(a,&sohang,socot);
	printf("Sau khi them mot hang:\n");
	xuat(a,sohang,socot);
	themhang(a,&sohang,socot);
	printf("Sau khi them hai hang:\n");
	xuat(a,sohang,socot);
	getch();
	return 0;
}

void themhang(int **a,int *sohang,int socot){
	int i,j;
	(*sohang)++;
	a=(int**)realloc(a,sizeof(int*)*(*sohang));
	a[*sohang-1]=(int*)malloc(sizeof(int)*socot);
	for(i=*sohang-1;i>0;i--)
		for(j=0;j<socot;j++)
			a[i][j]=a[i-1][j];
	for(i=0;i<socot;i++)
		a[0][i]=5;
}

void xuat(int **a,int sohang,int socot){
	int i,j;
	for(i=0;i<sohang;i++){
		printf("%d",a[i][0]);
		for(j=1;j<socot;j++)
			printf(" %d",a[i][j]);
		printf("\n");
	}
}

Ngộ lắm, em không tách hàm việc thêm hàng, gom chung trong hàm main luôn thì không sao, nhưng cứ tách hàm ra là bị, mà gọi hàm lần thứ nhất bình thường, lần thứ hai mới bị lỗi

Mong các anh chị giải thích lỗi và tìm hướng giải quyết

Do realloc có thể cấp phát một vùng nhớ khác vì không còn nới ra được nữa, như vậy tham số mảng của hàm thêm phải truyền tham biến.

2 Likes

Truyền tham biến nghĩa là sao ạ, em biết có cái cách truyền ghi &a ở phần định nghĩa hàm, nhưng hình như c++ mới hỗ trợ mà

Truyền tham biến tức là tham số thực tế được truyền thẳng vào hàm (thay vì copy), nhờ đó có thể thay đổi được nội dung của nó.

Trong C ta dùng con trỏ để cài đặt (thêm một sao * chỗ tham số hình thức).

2 Likes

Đoạn code trên có một số lỗi sau:

  1. Định nghĩa hàm themhang không đúng. Cần thêm kiểu trả về void và các tham số đầu vào.
  2. Trong hàm themhang , biến a được khai báo lại nên không thể thay đổi giá trị của biến a trong hàm main. Cần khai báo biến a là con trỏ hợp lệ để có thể thay đổi giá trị của nó.
  3. Trong hàm themhang , cần khởi tạo giá trị cho các phần tử của hàng mới thêm vào. Hiện tại, chỉ có phần tử đầu tiên của hàng mới được khởi tạo giá trị bằng 5, còn các phần tử còn lại vẫn giữ giá trị cũ của hàng trước nó.
  4. Trong hàm themhang , vòng lặp for(i=*sohang-1;i>0;i--) không có ý nghĩa vì i không được sử dụng trong vòng lặp.

Sau đây là đoạn code sửa lỗi:

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

void themhang(int**, int*, int);

void xuat(int**, int, int);

int main(){ int **a, i, j, sohang=3, socot=3; a=(int** )malloc(sizeof(int*) *sohang); for(i=0;i<sohang;i++) a[i]=(int* )malloc(sizeof(int)*socot); for(i=0;i<sohang;i++) for(j=0;j<socot;j++) a[i][j]=3;
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?