2011-10-20 35 views
10

Đây là sự tiếp nối của một số question khác.initialisation string string

Xét đoạn mã sau:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

Nó không biên dịch để tôi ngạc nhiên (rõ ràng là tôi không biết cú pháp C cũng như tôi nghĩ) và tạo ra các lỗi sau:

error: initializer element is not constant 

Nếu tôi thay đổi char * vào char [] nó biên dịch tốt:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

ai đó có thể giải thích cho tôi tại sao?

Trả lời

6

Trong ví dụ đầu tiên (char *hi = "hello";), bạn đang tạo một con trỏ không const được khởi tạo để trỏ đến chuỗi const tĩnh "hello". Con trỏ này có thể, theo lý thuyết, chỉ vào bất cứ thứ gì bạn thích.

Trong ví dụ thứ hai (char hi[] = "hello";), bạn xác định cụ thể một mảng, không phải là một con trỏ, do đó địa chỉ mà nó tham chiếu không thể sửa đổi được. Lưu ý rằng một mảng có thể được coi là một con trỏ không thể sửa đổi thành một khối bộ nhớ cụ thể.

Ví dụ đầu tiên của bạn thực sự biên dịch mà không gặp vấn đề gì trong C++ (trình biên dịch của tôi, ít nhất).

+1

cảm ơn. có cách nào để sử dụng từ khóa const để làm cho đoạn mã đầu tiên hoạt động không? – lang2

+1

@ lang2 Không nằm trong phạm vi đó. Xem [C FAQ] này (http://c-faq.com/ansi/constasconst.html). Không, ngay cả với 'char * const hi' (hằng số trỏ tới char). – cnicutar

+0

Chỉ cần thêm một cái gì đó, tho 'Tôi không chắc chắn nếu nó sẽ làm việc ... phiên bản đầu tiên của bạn biên dịch OK trong C + + - Tôi sẽ thử với một trình biên dịch C khi tôi nhận được một thời điểm :) – icabod

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