Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Hỏi về nơi lưu của hằng trong ngôn ngữ C

    Cho mình hỏi khi khai báo các hằng thì vị trí lưu của chúng là ở đâu??

    Ví dụ:
    int a; // a là biến số, a được lưu trên RAM, ai cũng biết!!!!
    const int b = 5; // b là hằng số, b lưu ở đâu???
    char * p = "Hello, World!!"; // "Hello, World!!" là chuỗi hằng, nó được lưu ở đâu???

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi thanhdang8x
    Cho mình hỏi khi khai báo các hằng thì vị trí lưu của chúng là ở đâu??

    Ví dụ:
    int a; // a là biến số, a được lưu trên RAM, ai cũng biết!!!!
    const int b = 5; // b là hằng số, b lưu ở đâu???
    char * p = "Hello, World!!"; // "Hello, World!!" là chuỗi hằng, nó được lưu ở đâu???
    C không qui định là biến phải được đặt ở đâu trong bộ nhớ. Việc đặt biến ở đâu thì còn tùy vào từng máy và trình biên dịch cụ thể. Theo mình biết thì trên Linux sẽ là thế này:

    - int a: nếu a là local variable, biến a sẽ được cấp phát trên stack (chỉ đơn giản là con trỏ stack sp giảm đi 4 bytes (nếu int là 4 bytes)), còn nếu a biến global (như khai báo ngoài hàm) thì a sẽ được đặt trên vùng bss của chương trình.

    - const int b = 5: việc b có được cấp phát bộ nhớ hay không thì còn tùy vào cách dùng của b trong chương trình. Nếu chỉ đơn giản là dùng để thay cho biến 5, rất có thể trình biên dịch không cấp phát bộ nhớ cho b. Nhưng nếu có những phép toán như là lấy địa chỉ (&b) thì trình biên dịch buộc phải cấp địa chỉ cho b, và trong trường hợp này thì việc b được cấp phát ở đâu cũng sẽ tùy theo là b là global hay local. Nếu b là local, thì nó sẽ được cấp phát trên stack, còn nếu là global thì nó sẽ được cấp phát trên vùng data (và được lưu trong file chạy).

    - char *p = "Hello, World!": ở đây sẽ có hai thứ được cấp, mảng để chứa chuỗi "Hello, World!" (tất nhiên là sẽ bao gồm cả kí tự nul) và biến con trỏ p. Việc cấp phát bộ nhớ cho p cũng tùy thuộc như với hai trường hợp ở trên. Với mảng chứa kí tự, nó sẽ đặt ở một vùng nhớ read-only (gọi là rodata trên Linux, nếu mình nhớ không lầm). Do nó read-only nên việc thay đổi chuỗi qua con trỏ p sẽ gây lỗi. Lưu ý là chuỗi này sẽ được lưu ở file chạy và sẽ được đọc vào bộ nhớ khi chương trình chạy. Nó khác với biến a, trong trường hợp là global, vì a sẽ không được lưu trong file chạy.

    Lưu ý thêm một điểm nữa, nếu có khai báo

    char array[] = "Hello, World!", thì trình biên dịch sẽ cấp phát một vùng nhớ đủ để chứa chuỗi "Hello, World!" (và kí tự nul) và khởi tạo vùng nhớ đó với chuỗi kí tự này. Sẽ không có thêm việc cấp phát một con trỏ tên là array trỏ đến vùng nhớ này.

  3. #3
    Chào thanhdang8x !

    Nếu bản muốn biết chuỗi char * p = "Hello, World!!"; lưu ở đâu thì trước hết bạn phải hiểu "Run-time Strorage" ?
    Một chương trình C bạn khi chạy có 4 chỗ lưu trữ :
    - Code segment : là vùng nhớ lưu trữ mã code của bạn
    - Global area : chứa các biến global, biến static
    - Stack segment : Chứa các tham chiếu (parameters) và biến local
    - Heap segment : chứa các vùng nhớ cấp pháp động (con trỏ)
    Tôi chỉ gợi ý như vậy bạn tìm hiểu thêm nha , vấn đề này có nhiều thứ để nói lắm

    Tham khảo lập trình C căn bản ;


 

 

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
  •