Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 2 của 2 Đầu tiênĐầu tiên 12
Kết quả 11 đến 12 của 12
  1. #11
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    về cơ bản, thì khi chưa khởi tạo giá trị cho 1 biến nào đó mà đã sử dụng biến đó rồi thì sẽ bị lỗi, thường có thể bị lỗi ngay lúc biên dịch, hoặc cũng có thể biên dịch xong, chạy được rồi đến đoạn sử dụng biến đó thì mới phát hiện là "chưa khởi tạo giá trị" nên nó mới báo lỗi
    đối với biến con trỏ cũng tương tự, khi ta chưa cho nó trỏ vào ô nhớ nào cả thì ko thể gán giá trị cho ô nhớ mà nó trỏ đến được, vì tại lúc gán giá trị (*p = 2) thì chưa biết p đang trỏ đến đâu mà đặt giá trị 2 vào ô nhớ đó...
    Trích dẫn Gửi bởi lorgan
    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. #12
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Nguyen.TienHai
    về cơ bản, thì khi chưa khởi tạo giá trị cho 1 biến nào đó mà đã sử dụng biến đó rồi thì sẽ bị lỗi, thường có thể bị lỗi ngay lúc biên dịch, hoặc cũng có thể biên dịch xong, chạy được rồi đến đoạn sử dụng biến đó thì mới phát hiện là "chưa khởi tạo giá trị" nên nó mới báo lỗi
    đối với biến con trỏ cũng tương tự, khi ta chưa cho nó trỏ vào ô nhớ nào cả thì ko thể gán giá trị cho ô nhớ mà nó trỏ đến được, vì tại lúc gán giá trị (*p = 2) thì chưa biết p đang trỏ đến đâu mà đặt giá trị 2 vào ô nhớ đó...
    Không hề có lỗi biên dịch ở đây nhé.
    Cơ bản là khi khai báo không kèm khởi tạo con trỏ *p trong hàm, giá trị của p sẽ là một số bất kỳ. p ở đây sẽ là một biến được lưu trong stack, giả sử với con trỏ 32bit thì giá trị của p là ở 32bit ở đáy của stack này. Mà giá trị mấy ô nhớ này thì không xác định trước được.
    Cho nên tùy vào giá trị của mấy ô nhớ đó mà phép gán *p = 2 có thể cho ra các kết quả khác nhau, có thể là lỗi segfault vì truy cập tới địa chỉ không hợp lệ, cũng có thể là chạy được vì ngẫu nhiên nó có giá trị là một địa chỉ hợp lệ.

 

 
Trang 2 của 2 Đầu tiênĐầu tiên 12

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
  •