Tại sao con trỏ không trỏ tới mảng động?

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;

void	inputSequence(int* pt1, int* pt2,int &n1, int &n2)
{
	int i,j;
	cout << "Hay nhap so phan tu day 1: ";
	cin >> n1;
	cout << "Hay nhap so phan tu day 2: ";
	cin >> n2;
	pt1=(int*)calloc(n1,sizeof(int));
	pt2=(int*)calloc(n2,sizeof(int));
	cout << "Nhap phan tu day 1:" << endl;	
	for (i=1;i<=(n1);i++)
	{
		cout << "Hay nhap phan tu thu " << i << endl ;
		cin >> pt1[i-1];
	}
	cout << "Nhap phan tu day 2:" << endl;
	for (i=1;i<=(n2);i++)
	{
		cout << "Hay nhap phan tu thu " << i << endl ;
		cin >> pt2[i-1];
	}
	cout << "Complete" << endl;
}
void	printSequence(int* pt, int size)
{
	int i;
	for (i=0;i<size;i++)
		cout << pt[i];
}

int main()
{
	int* pt1=NULL;
	int* pt2=NULL;
	int size1,size2;
	inputSequence(pt1,pt2,size1,size2);
	printSequence(pt1,size1);
	getchar();
	getchar();
	return 0;
}

bị lỗi ở hàm printSequence, pt1 được cấp phát nhưng sau khi ra khỏi hàm input thì bị mất. Giúp mình với

Memory leak rồi…

Sửa như thế nào vậy anh? free 2 con trỏ hả anh?

Mình nghĩ nên làm thế này:

#include <iostream>
using namespace std;

int* input(int* p)	{

	p = new int[10];
	
	for(int i = 0; i < 10; i++)
		p[i] = i+1;
		
	return p;
}

void output(int* p)	{
	
	for(int i = 0; i < 10; i++)
		cout << p[i] << " ";
}

int main() {
	
	int* p;
	
	p = input(p);
	output(p);
	
	delete[] p;
	return 0;
}

Khi đó con trỏ trong hàm main vẫn kiểm soát được.

1 Like

phải return về cho con trỏ à :frowning:

Mình hiểu nhưng ko biết giải thích sao :dizzy_face: Mình ít làm mấy bài này nên không rõ lắm, thắp nhang thỉnh thánh con trỏ @ltd vào xem thế nào :dizzy_face:


Con trỏ cũng là một biến kiểu nguyên dùng để lưu 1 con số là địa chỉ đầu của vùng nhớ. Trong kiểu truyền con trỏ vào hàm trên là truyền tham trị, chỉ truyền giá trị bản sao của con trỏ, khi ra khỏi hàm thì con trỏ làm tham số của hàm cũng bị hủy như những biến khác. Return con trỏ trong hàm cho biến khác quản lý đảm bảo hơn. :dizzy_face:
Mình nghĩ ít ai dùng kiểu cấp phát bên trong hàm như thế này (Trừ khi dùng smart pointer) :dizzy_face:
1 Like

void inputSequence(int*& pt1, int*& pt2,int &n1, int &n2)
{

}
Mình nghĩ bạn @nguyenchiemminhvu nói đúng rồi, bạn có thể sửa lại như thế này.

2 Likes

tks @nguyenchiemminhvu@Domino nhé… mình hiểu sơ sơ rồi. Mình thử làm bằng reference thì đúng thật. Sau đó mình thử bằng cách đặt con trỏ 2 cấp **pt1 làm thử cũng được. Con trỏ mình truyền vào chỉ gắn với vùng nhớ được cấp phát thôi. Có vẻ phải nghiên cứu thêm thôi :frowning:

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