-
24-08-2014, 11:42 AM #1
Junior Member
- 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???View more random threads:
- Anh chị xem giúp em bị lỗi gì với ạ!
- trong visual studio có cách nào để dùng winform mà vẫn dùng cách viết trên c++ được ?
- Dùng IDE nào để học C ?
- Lỗi bài toán "Nhập và xuất 2 ma trận vuông"
- Bài tập C cho lớp CT1301
- giúp mình bài tập tìm dãy số âm dài nhất
- Ma trận
- Hình Thoi Số Trong C ai giúp em cái
- [ Solved ]Danh sách liên kết
- Bài toán về hoán vị
-
25-08-2014, 09:47 AM #2
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi thanhdang8x
- 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.
-
25-08-2014, 03:56 PM #3
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
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 ;
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á...