Hỏi về con trỏ trong code C

các bác cho e hỏi là bài code ntn

int main()
{  int n2= 10;
   int n1= 6;
   int n0= 5;
   printf("n2=%d, n1=%d, n0=%d\n", n2, n1, n0);
   int* p = &n1;
   *p=9;
   p++;
   *p=15;
   p--;
   p--;
   *p=-3;
   printf("n2=%d, n1=%d, n0=%d\n", n2, n1, n0);
   getchar();
   return 0;
}


tại sao kết quả in ra n1 n2 n0 không thay đổi giá trị ạ

Bạn có thể giải thích ý định của bạn trong việc sử dụng dòng lệnh
p++

p–
được không?

Bên cạnh đó, bạn đã in giá trị của n2, n1, n0 sau khi gán giá trị mới để kiểm tra chưa?

(Chương trình của bạn có vẻ đã bị crash, process exited với giá trị trả về khác thường)

4 Likes

dạ e viết code nhầm em đã sửa lại ở trên r ạ . bài này em định dùng toán tử con trỏ ++ và – để lấy kết quả in ra của các biến đứng cạnh nhau của n2 là n1 và n3 ạ

Nếu bạn muốn con trỏ p đang trỏ đến n1 chuyển sang trỏ đến n2 hoặc n0, best practice là gán trực tiếp địa chỉ cho nó:

p = &n1;
// reassign new addess
p = &n2;
p = &n0;

Thực ra các biến n0, n1, n2 là biến local, được cấp phát vùng nhớ trên stack thì nó cũng xếp các biến có địa chỉ liền kề nhau, nhưng ai đảm bảo được.
Như bạn thấy trong phần output, chương trình bị crash vì trỏ lung tung và thay đổi giá trị trong vùng nhớ không hợp lệ.

Toán tử ++ và – áp dụng cho con trỏ thường chỉ nên sử dụng trong một đoạn vùng nhớ được cấp phát liên tục, ví dụ array

3 Likes

dạ vâng em cảm ơn ạ đề bài là giải thích kết quả ạ thì giải thích như bác đko ạ với cả cho e hỏi là em có thí nghiệm code dưới đây


tại sao khi xóa lệnh printf thì địa chỉ lại thay đổi và k thể gán giá trị đc nữa ạ. lệnh printf lấy địa chỉ có thay đổi địa chỉ gì k ạ ?

Câu này bạn phải tìm cách dùng chính trình dịch có sẵn dịch ra assembly, sau đó đọc code này lên để biết chuyện gì đang xảy ra :slight_smile:

1 Like

:)) dạ tức là k giải thích được với code này đko ạ . Bài tập này thầy em giao bắt giải thích kết quả mà khoai quá


em dùng complier trên mạng nó ra 1 kết quả mà em cx ko hiểu sao ra được kết quả ntn luôn ạ

5 posts were merged into an existing topic: Toán tử con trỏ và vùng nhớ stack

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