2010-08-16 36 views
13

thể trùng lặp:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?Tại sao không thể chuyển `char **` thành hàm `const char **` trong C?

Tôi tò mò, tại sao tôi không thể vượt qua một char ** để const char ** chức năng? Khi có thể vượt qua char * đến một chức năng const char *, có vẻ như không thể làm điều đó với con trỏ kép. Tôi nghĩ rằng nó luôn luôn là ok để thêm constness (nhưng không ok để thả constness) nhưng bây giờ có vẻ như tôi đã sai.

Gcc trình biên dịch được đưa ra cho tôi những errror:

note: expected ‘const char **’ but argument is of type ‘char **’ 

Dưới đây là đoạn mã:

int f(const char **a) { } 

int main() { 
    char *a; 
    f(&a); 
} 

Bất kỳ ý tưởng?

+0

Điều này có vẻ tương tự như http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c –

+2

BTW, to mọi người bỏ phiếu để đóng: đây không phải là bản sao chính xác của http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c kể từ đó một là đặc biệt về 'const char * const *'. (Tuy nhiên, một số câu trả lời có liên quan.) – jamesdlin

Trả lời

16

Bởi vì trình biên dịch không thể đảm bảo an toàn.

Xem Q11.10 từ FAQ comp.lang.c: Why can't I pass a char ** to a function which expects a const char **?

giả sử bạn thực hiện như sau loạt phức tạp hơn của tập:

const char c = 'x'; /* 1 */ 
char *p1;    /* 2 */ 
const char **p2 = &p1; /* 3 */ 
*p2 = &c;    /* 4 */ 
*p1 = 'X';    /* 5 */ 

Trong dòng 3, chúng ta gán một char ** đến const char **. (Trình biên dịch nên khiếu nại.) Trong dòng 4, chúng tôi chỉ định một const char * cho một số const char *; điều này rõ ràng là hợp pháp. Trong dòng 5, chúng tôi sửa đổi một điểm char * thành - điều này được cho là hợp pháp. Tuy nhiên, p1 kết thúc bằng cách trỏ đến c, là const. Điều này xuất hiện ở dòng 4, bởi vì *p2 thực sự là p1. Điều này đã được thiết lập trong dòng 3, đây là một sự gán cho một biểu mẫu không được phép, và đây chính là lý do tại sao dòng 3 không được phép.

Chỉ định char ** đến const char ** (như trong dòng 3 và trong câu hỏi ban đầu) không phải là nguy hiểm ngay lập tức. Nhưng nó thiết lập một tình huống trong đó hứa hẹn của p2 - rằng giá trị cuối cùng chỉ đến sẽ không được sửa đổi - không thể được giữ lại.

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