01/10/2018, 08:38
Về biến con trỏ và mảng 1 chiều
mọi người cho em hỏi là em code như thế này thì chương trình không báo lỗi, nhưng chạy chương trình tới lúc nhâp phần tử thứ … thì nó tự động tắt chương trình luôn. Mong mọi người giúp em ạ. Em cảm ơn!
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#include<conio.h>
void NhapPhanTu(int &n){
do{
printf("Nhap vao so phan tu: ");
scanf("%d", &n);
if(n<=0 || n>=100)
printf("Nhap sai! Nhap lai
");
}while(n<=0 || n>=100);
}
void XinCapPhat(int *a, int n){
a=(int*)malloc(n);
if(a==NULL){
printf("Khong du bo nho");
getch();
exit(1);
}
}
void NhapMang(int *a, int n){
for(int i=0; i<n; i++){
printf("Phan tu thu %d: ", i);
scanf("%d", a+i);
}
}
void XuatMang(int *a, int n){
for(int i=0; i<n; i++)
printf("%d ", *(a+i));
}
int main(){
int n, *a;
NhapPhanTu(n);
XinCapPhat(a,n);
NhapMang(a, n);
XuatMang(a,n);
return 0;
}
![](/pictures/picfullsizes/2018/10/01/sjn1538412823.png)
Bài liên quan
Đầu tiên là bạn đọc bài viết về cách sử dụng markdown cho cho việc chèn code ở đây.
Sau đó, mình có 1 câu hỏi: tại sao phải phải chia ra thành nhiều hàm khi vấn đề bạn đang giải quyết không có gì lớn? Khi chia ra nhiều hàm, bạn phải cân nhắc và tìm hiểu kỹ về vấn đề truyền con trỏ vào hàm. (Nếu bạn không chia nhiều hàm thì lỗi ít xảy ra!)
Lỗi trong code này xuất phát từ hàm
XinCapPhat()
, con trỏa
được truyền vào hàm này là địa chỉ con trỏ được khởi tạo ởmain()
, tại đây bạn lại đi cấp 1 vùng nhớ khác quamalloc()
, điều này đồng nghĩa với việc bạn không tác động gì đến vùng nhớ mà con trỏa
ởmain
trỏ tới (mình góp ý là đừng bao giờ đặt tên tham số trùng với tên biến, vì khó giải thích cho bạn hiểu). Một lỗi nữa là số bytes mà bạn xin cấp phát, 1 biến int thì thường là cần 4 bytes (với 32-bit) nên hên xui mà bạn sẽ gặp lỗi nếu số lượng phần tử lớn, chữa cháy bằngmalloc(n*sizeof(int));
Tóm lại 1 câu: hàm này vô nghĩa! Để hàm này có nghĩa thì bạn phải return con trỏ đó lại:
Còn mấy phần còn lại là OK
Góp ý lần nữa, bạn pha trộn C và C++ lộn tùm phèo: bạn muốn viết trên C mà lại dùng tham chiếu, còn nếu trên C++ thì không dùng
malloc()
đâu nha bạn. Khi dùngmalloc()
rồi thì nhớfree()
.Nếu đã chia hàm thì bạn phải hình dung:
em cảm ơn mọi người nhiều ạ, tại vì em làm theo 1 ví dụ trong sách. Sách viết code y như thế nhưng không hiểu sao lại có lỗi xảy ra
à anh ơi vậy nếu em làm thao tác xin cấp phát bộ nhớ trong hàm main thì vẫn được phải không anh
truyền con trỏ trỏ tới con trỏ cũng được phải ko bác
XinCapPhat()
cũng không trả về NULL nên dùng return cho lẹ với lại khỏi sợ quên dấu'&'