Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12
  1. #1
    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();
    }
    Xin mọi người giải đáp giúp mình

  2. #2
    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ỏ)

  3. #3
    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

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi lorgan
    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
    Đâu phải việc gì bạn làm đc thì cũng nên làm đâu nhỉ [IMG]images/smilies/smile.png[/IMG]

    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)

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Đâu phải việc gì bạn làm đc thì cũng nên làm đâu nhỉ [IMG]images/smilies/smile.png[/IMG]

    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)
    Nhưng mình muốn hiểu rõ bản chất việc gán này [IMG]images/smilies/biggrin.png[/IMG]

  6. #6
    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...

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    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]
    Mình không hiểu ý của bạn prog10 về vấn đề này, tuy nhiên, với C++ thì cú pháp T obj = new T() của bạn là sai hoàn toàn (phải chăng bạn đang nói đến cú pháp của C# so với C++, vì nó là của C# mà).

    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).

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Moscow
    (phải chăng bạn đang nói đến cú pháp của C# so với C++, vì nó là của C# mà).
    Chính xác.
    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.

  9. #9
    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]

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Chính xác.
    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.
    Thực sự, với những luận điểm này của bạn thì mình không hiểu nó có ý nghĩa cụ thể nào cho trường hợp mà bạn lorgan nêu ra ở trên. Nếu cứ chung chung thế này mình e rằng những trợ giúp của bạn sẽ không ổn cho những người mới học và đang cần hiểu những kiến thức cơ bản. Không biết những ý kiến này của mình có làm cho bạn phật ý chăng?

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •