30/09/2018, 18:13
Những lỗi thường gặp khi khai báo và khởi tạo con trỏ
#include <stdio.h>
int main()
{
int a = 2, *p;
p = &a;
//*p = a;
//p = a;
*p += a++;
printf("%d %d", *p, a);
return 0;
}
Em hiểu như thế này:
*int p; // là khai bái con trỏ p chưa khởi tạo nên p trỏ về 0 (là NULL)
p = &a; //quá rõ ràng không phải bàn nữa
Nhưng thay p = &a; là *p = a; thì compiler vẫn thực thi nhưng dính lỗi has stopped working (em biết gán như thế là lỗi nhưng em không giải thích được tại sao )
Còn thay p = &a; là p = a; //compiler báo lỗi, theo em nghĩa p chứa địa chỉ nên không thế gán = giá trị được
mọi người giải thích giúp em những vấn đề trên. Xin cảm ơn!
Bài liên quan
cái p = a thì không gán = giá trị theo em thì chuẩn r :v còn cái đầu thì nhờ cao nhân vậy
*p = a
là gán giá trị củaa
vào vùng nhớ mà con trỏp
trỏ tới, trong trường của bạnp
chưa trỏ tới vùng nhớ nào nên gây lỗi khi chạy.Đây là lỗi thường gặp trong lập trình C khi sử dụng con trỏ, bạn có thể google để tìm hiểu thêm:
https://www.quora.com/What-actually-happens-when-dereferencing-a-NULL-pointer
chỗ này đã thông não
mình hiểu ý của bạn nhưng vì khi mình debug tới *int p; thì thấy nó có trỏ tới địa chỉ lạ nào ấy, nếu đúng như thế thì tới dòng *p = a; thì nó phải gán giá trị a cho ô địa chỉ lạ đó chứ nhỉ.(ô địa chỉ mà p đang trỏ tới)
Khi bạn khai bảo con trỏ p:
int *p
mà không khởi tạo thìp
có thể được gánNULL
hoặc một giá trị không xác định (ô địa chỉ lạ kia như bạn nói). Giá trị không xác định này rất có là là một vùng nhớ không hợp lệ (invalid addresses) nên chương trình vẫn bị lỗi khi bạn chạy.sẵn hỏi luôn đây là vùng nhớ như thế nào nhỉ vùng nhớ này đã được cấp phát và sử dụng hay sao nhỉ?
Không phải đâu bạn, khi chưa khởi tạo thì con trỏ p sẽ trỏ tới một vùng nhớ ngẫu nhiên trong Ram.
Vùng nhớ này có thể đã được các chương trình khác sử dụng hoặc chưa.
Giả sử các chương trình khác đang sử dụng vùng nhớ đó mà bạn lại thay đổi giá trị vùng nhớ đó bằng việc: *p = a thì chương trình kia có thể sẽ chạy sai ==> Trình biên dịch sẽ báo lỗi ngăn không cho bạn làm như vậy.