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;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!

Nguyễn Hoàng Trung viết 20:19 ngày 30/09/2018

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

Pham Van Hai viết 20:14 ngày 30/09/2018

*p = a là gán giá trị của a vào vùng nhớ mà con trỏ p trỏ tới, trong trường của bạn p 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

Interns viết 20:18 ngày 30/09/2018

*p = a là gán giá trị của a vào vùng nhớ mà con trỏ p trỏ tới

chỗ này đã thông não

trong trường của bạn p chưa trỏ tới vùng nhớ 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)

Pham Van Hai viết 20:14 ngày 30/09/2018

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án NULL 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.

Interns viết 20:16 ngày 30/09/2018

một vùng nhớ không hợp lệ

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ỉ?

Ngo Dinh Quyen viết 20:29 ngày 30/09/2018

int *p; // là khai bái con trỏ p chưa khởi tạo nên p trỏ về 0 (là NULL)

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.

Bài liên quan
0