2009-09-02 46 views
23

Đã một lúc tôi sử dụng con trỏ và tôi chỉ muốn kiểm tra nhanh cách tôi có thể khởi tạo một con trỏ nguyên?Khởi tạo con trỏ đơn giản

a) int *tmpPtr = 0; 

b) int *tmpPtr = null; 

c) int a = 0; 
    int *tmpPtr = &a; 

EDIT

Cảm ơn tất cả những câu trả lời của bạn cho đến nay. Điều thú vị là, nếu tôi intitalize con trỏ như sau, sau đó mem :: hoạt động sao chép hoạt động tốt.

int tmp = 0; 
int *tmpPtr = &tmp; 
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int)); 

Tuy nhiên, nếu tôi làm điều đó như thế này:

int *tmpPtr = 0; 
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int)); 

sau đó tôi nhận được một vụ tai nạn trong mem :: bản sao ...

Weird!

+3

Bạn đang gặp sự cố vì int * tmpPtr = 0; là một con trỏ NULL và không trỏ vào một phân đoạn bộ nhớ có chứa một int. Về cơ bản, bạn đang nói con trỏ này trỏ vào không có gì và bạn không thể sao chép các số nguyên chiếm không gian bộ nhớ thành thứ không có dấu cách. int * tmpPtr = &tmp; Đang gán ADDRESS của bộ nhớ bị chiếm bởi tmp vào con trỏ của bạn. Ở đây bạn đang nói rằng con trỏ trỏ vào bộ nhớ được cấp phát cho tmp. Bây giờ, Sao chép thực sự có thể sao chép dữ liệu vào không gian đó bởi vì con trỏ của bạn đang trỏ vào thứ gì đó mà nó có thể sử dụng. –

+0

Vâng, điều đó khiến cho cảm giác thật tuyệt vời! Cám ơn vì đã giải thích! –

Trả lời

1

Bạn có thể làm điều đó theo bất kỳ cách nào ngoại trừ NULL. Tôi thích int * p = 0; trên int * p = NULL;

Để loại bỏ một số nhầm lẫn tôi cảm nhận, hãy đặt int * p = 0 hoặc đặt MyObject * p = 0; kết quả trong cùng một điều .... một con trỏ null mà thường sẽ sụp đổ chương trình của bạn nếu bạn cố gắng dereference nó mặc dù về mặt kỹ thuật đó là hành vi không xác định. Ví dụ bạn có trong C khác với các ví dụ khác bởi vì bạn đang thực sự đặt con trỏ trỏ đến một tập hợp số nguyên là 0.

 
int *pNull = 0; 
int c = *pNull; // Undefined behavior. Most likely crashing your program! 

int a  = 0; 
int *pInt = &a; 

int x = *pInt; // x equals 0 

a = 10; 
int y = *pInt; // y equals 10 

+0

Sự khác biệt là đối với a & b tmpPtr sẽ trỏ tới 0/null và cho c nó sẽ trỏ đến địa chỉ của –

37

Câu hỏi đơn giản là tốt, tôi nghĩ rằng nó được thiết lập tốt cho tất cả các cấp, không chỉ là một tầng lớp.

Không có null trong C (trừ khi bạn tự xác định). Khởi tạo một con trỏ null có thể được thực hiện theo một trong hai cách sau đây:

int *p = 0; 
int *p = NULL; 

Nếu bạn dereference p sau đó, bạn đang có khả năng để có được một vi phạm truy cập (Tôi tin rằng đó là hành vi không xác định theo tiêu chuẩn, thực sự, bất cứ điều gì có thể xảy ra, lên đến và bao gồm, hủy diệt toàn bộ vũ trụ - nó thậm chí có thể tiếp tục chạy tốt, nhưng tôi sẽ không dựa vào nó).

Để có được một con trỏ đến một số nguyên thực tế, chỉ cần sử dụng:

int a = 7; 
int *p = &a; 

sử dụng địa chỉ-của nhà điều hành.

Chỉnh sửa, không lạ chút nào, bạn chỉ cần hình dung nó. Giả sử tất cả các biến được tạo bắt đầu từ vị trí bộ nhớ 100 và số nguyên và con trỏ đều dài 4 byte. Phá vỡ hai tình huống của bạn xuống đến hình thức đơn giản nhất của họ:

        int x = 2; 
int *px = 0;      int *px = &x; 

     +-----+       +-----+ 
px(100): | 0 |     x(100) | 2 | 
     +-----+       +-----+ 
            px(104) | 100 | 
              +-----+ 

Sau đó, bạn thực hiện lệnh

*px = 7; 

trong một nỗ lực để thay đổi biến được trỏ đến bởi px.

Ở phía bên tay trái, bạn sẽ cố gắng ghi giá trị 7 vào vị trí bộ nhớ 0.Đó là một điều xấu; rất ít hệ thống sẽ cho phép bạn làm điều đó mà không bị rơi, thậm chí ít hơn sẽ cho phép nó mà không có bất kỳ tác động bất lợi nào (một số phiên bản của HP-UX thực sự hoạt động tốt).

Ở bên phải là những gì nên xảy ra. Giá trị được chọn từ px là 100, vì vậy giá trị 7 được ghi vào vị trí bộ nhớ đó, thay đổi x như dự định.

Tôi thường tìm thấy hình ảnh (ngay cả những tác phẩm nghệ thuật ASCII nguyên thủy, vì tôi không có Rubens hoặc Botticelli) giúp làm rõ các khái niệm. Hy vọng rằng nó xóa nó lên một chút cho bạn.

+0

Khi nào cần phân bổ bộ nhớ cho con trỏ? – Bionix1441

0

Không có null từ khóa trong C (ít nhất là trong ANSI C99). Bạn có thể sử dụng a) hoặc c).

Trong c) bạn sẽ không khởi tạo con trỏ bằng null, bạn sẽ khởi tạo nó bằng địa chỉ biến cục bộ.

1

Khởi tạo con trỏ trỏ đến không có gì bằng hằng số con trỏ null. Bất kỳ biểu thức hằng số nào có giá trị 0 đều là hằng số con trỏ null. Trong C NULL macro được sử dụng theo quy ước.

6

Trả lời cho câu hỏi của bạn trong EDIT:

  • Khi bạn làm điều này:

    int tmp = 0; 
    int *tmpPtr = &tmp; 
    Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int)); 
    

tmpPtr được trỏ đến địa chỉ của biến tmp và nó là trong stack. Và lưu ý rằng "khu vực an toàn" được chỉ bởi tmpPtr là kích thước của tmp (đó là 4 trong một số máy và 2 trong những người khác). Nếu bạn đã sao chép nhiều hơn sizeof (int) byte vào tmpPtr, bạn sẽ có nguy cơ bị rơi ngăn xếp.

  • Khi bạn làm điều này:

    int *tmpPtr = 0; 
    Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int)); 
    

Giá trị của tmpPtr là 0, do đó bạn sẽ nhận được một segment fault., mà là một cơ chế bảo vệ bộ nhớ được cung cấp bởi hệ thống hoạt động. Ví dụ: bạn không được phép viết bất kỳ virtual address nào nhỏ hơn 4K.

0

Dòng

int *tmpPtr = 0; 

khởi tạo con trỏ giá trị 0, vì vậy tmpPtr trỏ "đâu"; tức là, không phải là vị trí bộ nhớ hợp lệ. Bạn phải gán vị trí bộ nhớ hợp lệ cho con trỏ đầu tiên giống như bạn đã làm trong đoạn mã trước.

1

Tôi chỉ làm mới kiến ​​thức về con trỏ của mình và tình cờ gặp vấn đề này.

int *tmpPtr = 0; 

tôi tìm thấy nó dễ dàng hơn để nghĩ về nó như thế này:

int *tmpPtr ; 

tmpPtr = 0 ; 

Tôi tin '2 dòng trên là tương đương với một dòng. do đó về cơ bản địa chỉ được tham chiếu được đặt thành 0 hoặc NULL.

+0

Bạn nên khởi tạo biến của mình càng sớm càng tốt. Đề xuất thứ hai của bạn không khởi tạo con trỏ của bạn, nó chỉ làm nó sau này. –

Các vấn đề liên quan