Cấp phát ô nhớ cho các biến trong C

Em có test thử về việc cấp phát bộ nhớ và thấy các biến liên tiếp đc cấp phát ô nhớ 1 cách liên tiếp:
2293436
2293432
2293428
2293424
2293420
2293416
2293412
2293408
Em đã tìm thử nhưng không thấy tài liệu nào nói về cái này. Các anh cho em hỏi cái này có phải trong trường hợp nào các biến cũng đc cấp phát ô nhớ 1 cách liên tiếp hay chỉ là tùy từng máy (hoặc ngôn ngữ lập trình hay gì đó …) thôi ạ.

1 Like

các biến kia đều nằm trên stack thì nó nằm chồng lên nhau nên địa chỉ của chúng liên tiếp nhau đúng rồi. Có điều ko biết a nằm trên c hay b nằm dưới c thôi :V

nếu em muốn bảo đảm a nằm trước b, b nằm trước c thì cho vào 1 struct :V

struct {
  int a, b, c;
} abc; // abc.a nằm trước abc.b nằm trước abc.c
8 Likes

em cảm ơn anh ạ :ok_man: :ok_man:

1 Like

^^
Bổ sung:
Với toán tử dấu “,” (cùng một số toán tử đồng đẳng khác như || , && các thứ ),Tùy compiler nó biên dịch thuận hay biên dịch nghịch (trái sang hay phải sang).

@nguyen2812 : Cái này tìm hiểu cho biết ngang mức độ “do biến local thuộc vùng stack nên nó liên tiếp nhau như thế” là good rồi. Chứ tìm hiểu thêm cũng không giúp ích gì nhiều cho cuộc đời cả.

4 Likes

hình như dấu phẩy nó biên dịch từ trái sang phải bảo đảm mà :V
https://en.cppreference.com/w/c/language/operator_precedence
đây nè :V


nhớ keyword “operator precedence” sau này còn có thể tìm lại :V

4 Likes

Not at all ^^.
Mình nhớ ko nhầm là còn phụ thuộc vào compiler setting.
Vấn đề mình đề cập ở đây là order in compiling(quyết định thứ tự, vị trí biến, dòng lệnh) chứ ko phải order in operating(thứ tự tính toán)
https://www.quora.com/How-does-compiler-reads-the-code-in-c++-left-to-right-or-right-to-left

P/s: E/m sinh năm 91 ^^. Xin a/bạn @tntxtnt cho biết năm sinh để dễ xưng hô nhé

4 Likes

già hơn vài tuổi =] mà 91 cũng già rồi xưng em cũng ngại =]

dấu phẩy trong f(a, b) ko phải là toán tử :V Toán tử comma được định nghĩa rất rõ ràng :V Đúng là f(a, b) thì ko biết được đọc a trước b sau hay b trước a sau. Nhưng viết a = b, c; thì cả câu lệnh trả về c rất rõ ràng :V gán a=b, rồi gọi c, rồi trả về c :V Vì comma operator có order thấp nên a=b thực hiện trước, rồi mới tới comma :V

The use of the comma token as an operator is distinct from its use in function calls and definitions, variable declarations, enum declarations, and similar constructs, where it acts as a separator .

cũng hơi rắc rối nhỉ :V :V

cái này chính xác hơn https://en.cppreference.com/w/c/language/operator_other#Comma_operator

In the following contexts, the comma operator cannot appear at the top level of an expression because the comma has a different meaning:

generic selection là cái gì nữa đây :V

tóm lại nếu là toán tử thì nó định nghĩa rất rõ ràng trong cái bảng operator precedence kia nha :V

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?