-
26-09-2014, 09:33 AM #1
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
thắc mắc vấn đề về khởi tạo giá trị *p của con trỏ p khi con trỏ p chưa trỏ vào đâu cả.
Như chúng ta biết thì với khai báo :
int *p;
thì sau đó *p chính là giá trị của ô nhớ mà p trỏ vào , và p là biến con trỏ.
vậy khi mình khai báo cho p xong mà chưa cho p trỏ vào đâu hết mà đã gán cho *p = một giá trị int nào đó . thì chuyện gì sẽ xảy ra
Mã:#include <stdio.h> #include <conio.h> /* */ main() { int *p; *p=2; printf("%d",*p); getch(); }
View more random threads:
- Chuyễn từ C sang C#
- khai báo int* x và int *x
- [giúp] danh sách liên kết đơn !!!
- Xin bộ test + - * các số nguyên lớn
- Bài tập C++, so sánh diện tích tam giác
- Mảng con trỏ hàm đến các oprerator
- Phát file wav bằng thư viện libsndfile
- Lỗi ndefined symbol _colosegraph in module ...cpp
- Không thể scanf("%s",s1); trên VS 2012 ?
- hỏi nhập/xuất
-
26-09-2014, 10:32 AM #2
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
giống như bạn đi trên 1 con đường, chỗ ngồi ko xác định thì bạn có thể ngồi dưới lòng lề đường. Đường vắng (vùng nhớ ko được chương trình nào sử dụng) thì ko sao, còn đường xe đông (vùng nhớ được sử dụng) thì hên xui [IMG]images/smilies/smile.png[/IMG] 1 cái xe tông vào thì bạn ko còn nguyên vẹn nữa (bị chương trình khác thay đổi giá trị), hoặc bạn làm cái xe bị lật (gây lỗi cho chương trình đang chạy / chương trình khác), hoặc tệ hơn nữa là làm đổ xe tải hạng nặng (trỏ vào vùng làm việc của system) gây ra tai nạn dây chuyền.
hình như địa chỉ bây giờ là ảo hết rồi nên tránh được việc đụng chương trình khác / system, nhưng vẫn có thể bị đụng xe người nhà (chương trình chứa con trỏ)
-
26-09-2014, 05:41 PM #3
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
nhưng câu trả lời của anh chỉ là về vấn đề cấp phát storage cho con trỏ , nhưng vấn đề em muốn hỏi là , con trỏ chưa trỏ đến đâu sao mình lại có thể khởi tạo cho giá trị mà nó trỏ tới
-
26-09-2014, 06:42 PM #4
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi lorgan
Có thể là do vấn đề lịch sử, chứ OS sau này ko cho gán lung tung vậy đâu. (deref là error ngay)
-
27-09-2014, 08:08 AM #5
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
-
27-09-2014, 09:48 AM #6
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
thì giá trị của con trỏ là địa chỉ mà nó trỏ tới thôi.
Vd khai báo
int x;
cout << x << endl;
thì sẽ thấy x có giá trị ngẫu nhiên, vd -1242323, 235443, 5165, 0, -5, v.v... Cứ coi con trỏ là int thì cũng vậy:
int* x;
cout << x << endl;
nó in ra số dưới dạng hex, vd 0x12345, 0x234, 0x561f, 0xa23b, v.v... Khi gọi *x thì máy tính sẽ tới địa chỉ thứ vd 0x12345 rồi lấy/gán giá trị của ô đó.
con trỏ là 1 dạng số nguyên ko dấu thôi ko có gì cao siêu cả. Giá trị nó chứa hiểu là địa chỉ cũng như địa chỉ nhà. Vd x chứa giá trị 123 có thể hiểu là 123 căn nhà, nếu x có type là int, hoặc căn nhà số 123, nếu x có type là int*. Nếu hiểu là căn nhà số 123 thì khi gọi *x = 1; máy sẽ tới căn nhà thứ 123, gán 1 (người, cái bàn, chiếc xe, v.v...) vào nhà này.
nếu khai báo int* x = NULL; thì coi như x ko chứa địa chỉ nhà nào hết => gọi *x máy sẽ báo lỗi chưa ghi địa chỉ sao biết tìm đến địa chỉ nào.
* có lẽ bạn từ các ngôn ngữ cao hơn chuyển xuống C, đây là cái 'hạn chế' của C, lập trình viên toàn quyền bảo C làm gì thì nó sẽ làm y như vậy.
int* x = 123;
*x = 1;
nó cũng sẽ làm.
Có quyền hạn như vậy thì phải có trách nhiệm gán NULL cho con trỏ mỗi khi khai báo. With great power comes great responsibility...
-
27-09-2014, 02:49 PM #7
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
Vấn đề của bạn lorgan đưa ra mình chỉ giải thích gọn thế này: câu lệnh *p=2 chỉ có thể ổn khi và chỉ khi p là một địa chỉ hợp lệ, được cấp phát rõ ràng. Bạn có thể cấp phát memory cho nó bằng new operator (cấp phát trực tiếp) hoặc cấp phát thông qua việc trỏ tới một vùng nhớ hợp lệ nào đó đã được cấp phát từ trước (cấp phát gián tiếp).
-
27-09-2014, 03:05 PM #8
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Moscow
Bởi vì 1 object suy cho cùng cũng chỉ là 1 dãy bit ở đâu đó trên mem và thêm 1 đống khái niệm đi kèm.
-
27-09-2014, 04:31 PM #9
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Thực ra khi ghi T obj = new T() thì chẳng qua cũng là T* obj = new T() mà thôi [IMG]images/smilies/biggrin.png[/IMG]
-
28-09-2014, 05:12 PM #10
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
khi đề cập đến đội hình MU, không thể ko nói tới một trong các câu lạc bộ bóng đá huyền thoại và với tầm ảnh hưởng nhất trong lịch sử của môn thể thao vua. Với hơn 1 thế kỷ còn đó và phát triển,...
Đội hình MU - Manchester United:...