-
10-05-2014, 05:25 PM #1
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
int *p =(int*)malloc(1) cấp phát 1 byte;*p=n kiểu int (4 bytes) chương trình vẫn chạy đúng.Vậy code sai hay đúng?
Mã:#include<stdio.h> #include<conio.h> #include<malloc.h> void main() { int *p,n=5; p = (int *)malloc(1); for(int i = 0;i<n;i++) { printf("Nhap phan tu thu %d: ",i+1); scanf("%d",&p[i]); } for(int i = 0;i<n;i++) printf("%d ",p[i]); getch(); }
Mã:#include<stdio.h> #include<conio.h> #include<malloc.h> void main() { int *p,n=5; p = (int *)malloc(1); *p = n; printf("%d",*p); getch(); }
Mã:#include<stdio.h> #include<conio.h> #include<malloc.h> void main() { char *p; p = (char *)malloc(1); gets(p); printf("%s",p); getch(); }
__________________________
Những gì mình học về con trỏ trên trường là ví dụ như muốn lưu 5 giá trị kiểu int thì ta cấp phát như sau:
p = (int *)malloc(5*sizeof(int));
hoặc 1 chuỗi ký tự gồm n ký tự:
p = (int *)malloc(n + 1);
Mong mọi người giúp mình gở rối. [IMG]images/smilies/biggrin.png[/IMG]
P.s:Mình dùng visual studio 2010.View more random threads:
- rắc rối về con trỏ
- các pro chỉ em cách đọc loại vòng lặp for này đuọc không ah em cám on nhìu. loại này có vẽ khó đọc
- ai có code sắp xếp danh sách họ tên cho xem tham khảo với
- lỗi no matching function for call to `vector::vector(vector)'
- Lập trình hướng đối tượng
- Cách làm ... như thế nào?
- Giải thích giúp lỗi này trong VS 2010
- Vấn đề về switch case
- Bài toán nhấp danh sách học viên
- Số nguyên tố trong mảng
-
10-05-2014, 06:01 PM #2
Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
code sai.
đường vắng thì đậu xe dưới lòng đường vẫn ổn. Tới khi xe đông thì gây tai nạn. Cái này cũng tương tự, cấp phát 1 byte lề đường để chứa 4 chiếc xe thì 3 chiếc xe kia nó nằm dưới lòng đường. Chưa gây tai nạn ko có nghĩa là đậu xe dưới lòng đường an toàn.
Tương tự cho cái cấp phát chuỗi ko đủ bộ nhớ kia.
-
10-05-2014, 06:27 PM #3
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
-
11-05-2014, 06:41 PM #4
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Moscow
-
11-05-2014, 07:01 PM #5
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Khi có một chương trình thứ 2 nào đó đang dùng bộ nhớ từ sau địa chỉ của p[0] (tức là từ &p[1] trở đi) thì việc bạn ghi đè vào bộ nhớ này của chương trình thứ 2 này sẽ gây lỗi cho chương trình của bạn (và có thể gây lỗi cho chương trình thứ 2 này); như vậy việc làm của bạn thật sự là thiếu an toàn. Code chạy được không có nghĩa chương trình của bạn thực sự OK. Bạn nhận ra vấn đề đó và thắc mắc như vậy cũng là một tư duy sâu sắc về code trong khi nhiều bạn khác không tư duy nhận ra vấn đề này. Đối với việc sử dụng stack (ví dụ như kiểu char p[4] mà bạn lại đi ghi lên p[4] trở đi) thì bạn sẽ có thể ghi đè lên các variables trong cùng function, hoặc đôi khi sẽ ghi đè lên return value của function; những việc làm này sẽ làm chương trình của bạn bị chết; và đôi khi người ta sẽ khai thác lỗi này của bạn để điều khiển chương trình của bạn (bạn có thể tìm và hiểu về buffer overflow); lỗi tràn bộ đệm và đôi khi corrupt stack.
-
13-05-2014, 06:51 PM #6
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bàn #Moscow nói khá chính xác đấy. Nói vui tí là bạn thếm 1 lỗi "memory leak" do không giải phóng bộ nhớ nữa, tin tặc có thể tấn công lấy cắp nhiều thông tin lắm đấy [IMG]images/smilies/clap_grin.gif[/IMG]
NGUỒN SỈ ÁO KHOÁC DENIM NỮ TPHCM CHẤT LƯỢNG CAO Bạn muốn nhập sỉ áo khoác denim nữ để bắt đầu việc buôn bán Online phong cách nhưng lại chưa có kinh nghiệm, muốn sắm xưởng sỉ xống áo vừa có thể giải...
Xưởng sỉ áo khoác jeans denim giá...