30/09/2018, 16:38

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

... viết 18:49 ngày 30/09/2018

Memory leak rồi…

Minh Hoàng viết 18:49 ngày 30/09/2018

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

... viết 18:52 ngày 30/09/2018

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.

Minh Hoàng viết 18:52 ngày 30/09/2018

phải return về cho con trỏ à

... viết 18:39 ngày 30/09/2018

Mình hiểu nhưng ko biết giải thích sao 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


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:
Nguyễn Phi Ánh viết 18:52 ngày 30/09/2018

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.

Minh Hoàng viết 18:53 ngày 30/09/2018

tks @nguyenchiemminhvu và @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

Bài liên quan
0