01/10/2018, 16:15

Hỏi về code mảng con trỏ

#include <iostream>
using namespace std; 
int* nhapmang(int *n){
		cin >> *n;
			int arr[100];
	
	for(int i=0;i< *n;i++){
		cin >>arr[i];
	}
	
	return arr;
}

int main(){
	
	int n;
	int *x=nhapmang(&n);
	cout<<show<<x[2]<<endl;
	for(int i=0;i< n;i++){
		cout <<x[i]<<endl;
	}
	return 0;
}

kết quả ra như sau :

tai sao cout<<show<<x[2]<<endl chạy đúng; chạy đúng mà vòng for thi không đúng ạ
em đã thử khai bao int *arr=new int[100]; ở hàm nhapmang thì lại chạy đúng
thật không hiểu được . ai có thể giải thích hộ em với ạ thanks .

Trần Hoàn viết 18:29 ngày 01/10/2018
cout << "show" << x[2] << endl;
name viết 18:17 ngày 01/10/2018

int arr[100];

là 1 sự khởi tạo tạm bợ, vì vậy khi kết thúc hàm nó trở thành vùng nhớ tự dễ mất hết dữ liệu bởi hành vi ghi đè của hàm khác.

hãy sinh ra cá`i mảng đó trước rồi truyền vào hàm theo đối số ví dụ int* nhapmang(int *n,int array[])
> int main(){

int n;
int arr[100];
	int *x=nhapmang(&n,arr);
	cout<<show<<x[2]<<endl;
	for(int i=0;i< n;i++){
		cout <<x[i]<<endl;
	}
	return 0;
}
lamit viết 18:18 ngày 01/10/2018
#include<iostream>
using namespace std;

//Ham nhap 01: Khoi tao mang a trong ham nhap
int* NhapMang(int n, int*a) {
	a = new int[n];
	for (int i = 0; i < n; i++) {
		cout << "Nhap a[" << i << "]: ";
		cin >> a[i];
	}
	return a;
}

//Ham nhap 02: Khoi tao mang a trong ham main
void NhapMang02(int n, int *a) {
	for (int i = 0; i < n; i++) {
		cout << "Nhap a[" << i << "]: ";
		cin >> a[i];
	}
}


//Ham xuat
void XuatMang(int n, int *a) {
	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
}

int main() {
	int n;
	cout << "Nhap so luong phan tu: ";
	cin >> n;

	//Cach 01
	int *a = NULL;
	a=NhapMang(n, a);
	XuatMang(n, a);

	//Cach 02
	int *b = new int[n];
	NhapMang02(n,b);
	XuatMang(n, b);

	
	cout << a[2] << endl;
	system("pause");
}
NBQ viết 18:28 ngày 01/10/2018

Trong hàm nhapmang() bạn khai báo biến int arr[100] với ý định nhập vào các phần tử của mảng này. Tuy nhiên đây là một biến cục bộ cho nên nó được lưu vào vùng nhớ stack, sau khi kết thúc hàm này, biến này sẽ được xóa. Ở cuối hàm bạn return arr là trả về địa chỉ phần tử đầu tiên của mảng arr, tuy nhiên ở trong hàm main (bên ngoài hàm nhapmang), các giá trị tại vùng nhớ arr[i] là các giá trị ngẫu nhiên cho nên mới có kết quả như vậy.

em đã thử khai bao int *arr=new int[100]; ở hàm nhapmang thì lại chạy đúng
Khi bạn khai báo như vậy thì thực chất là bạn đã cấp phát vùng nhớ động cho con trỏ arr, biến arr sẽ được lưu tại vùng heap, thay đổi giá trị của của các phần tử arr[i] sẽ không bị mất đi cho đến khi bạn giải phóng vùng nhớ đó bằng lệnh delete(arr) cho nên nó có thể được truy xuất ở bên ngoài hàm nhapmang.

Với bài toán của bạn có thể tham khảo đoạn code sau đây:

#include <iostream>
using namespace std; 
void nhapmang(int *array, int n)
{
	for(int i = 0; i< n; i++){
		cin >> *(array + i);
	}
}

int main()
{
	int n;
	int array[100] = {0};
    
    cout << "Nhap so phan tu cua mang:";
	cin >> n;
	nhapmang(array, n);
	cout << "\nshow array[0] = " << array[0] << endl;
	for(int i = 0; i< n; i++){
		cout << array[i];
		cout << " ";
	}
	cout << endl;
	return 0;
}
Quang Ict viết 18:27 ngày 01/10/2018

Thanks mọi người. có vẻ đã hiểu hơn

Bài liên quan
0