2010-02-23 37 views
31

Tôi đang cố gắng in danh sách một danh sách được liên kết đơn lẻ mà tôi đã gọi trong số link text. Nó hoạt động, nhưng tôi làm được những lời cảnh báo trình biên dịch:Khởi tạo loại bỏ vòng loại từ loại mục tiêu con trỏ

Initialization discards qualifiers from pointer target type

(trên tuyên bố bắt đầu = đầu) và

return discards qualifiers from pointer target type

(trên câu lệnh return) trong mã này:

/* Prints singly linked list and returns head pointer */ 
LIST *PrintList(const LIST *head) 
{ 
    LIST *start = head; 

    for (; start != NULL; start = start->next) 
     printf("%15s %d ea\n", head->str, head->count); 

    return head; 
} 

Tôi đang sử dụng XCode. Có suy nghĩ gì không?

Trả lời

65

Đó là một phần này:

LIST *start = head; 

Các tham số cho hàm là một con trỏ tới một hằng số, const LIST *head; điều này có nghĩa là bạn không thể thay đổi những gì nó trỏ đến. Tuy nhiên, con trỏ ở trên là không-const; bạn có thể dereference nó và thay đổi nó.

Nó cần phải được const cũng như:

const LIST *start = head; 

cũng áp dụng như kiểu trả về của bạn.


Tất cả trình biên dịch được nói là: "Này, bạn nói với người gọi 'Tôi sẽ không thay đổi bất cứ điều gì', nhưng bạn đang mở ra cơ hội cho điều đó".

+0

câu hỏi ngớ ngẩn, nhưng những gì hiện một const kiểu trả về cái nhìn như thế nào? Tôi đã thử tìm kiếm trên web và dường như tôi không thể tìm thấy. – Crystal

+5

@Crystal - 'const DANH SÁCH * PrintList (const LIST * head) {...}' –

+0

'Tham số cho hàm là một con trỏ liên tục' - không chính xác. 'const LIST * head' khai báo đầu như một con trỏ tới một DANH SÁCH liên tục. Xem: http://c-faq.com/decl/constparm.html - có lẽ đây chỉ là một sự hiểu lầm trong từ ngữ. – CivFan

17

Trong chức năng sau đây bạn sẽ nhận được cảnh báo mà bạn gặp phải với,

void test(const char *str) { 
    char *s = str; 
} 

Có 3 sự lựa chọn:

  1. Tháo modifier const của param:

    void test(char *str) { 
        char *s = str; 
    } 
    
  2. Khai báo biến mục tiêu cũng như const:

    void test(const char *str) { 
        const char *s = str; 
    } 
    
  3. Sử dụng một loại chuyển đổi:

    void test(const char *str) { 
        char *s = (char *)str; 
    } 
    
Các vấn đề liên quan