2010-05-05 40 views
5

Việc khởi tạo mảng sau có chính xác không? Tôi đoán nó là, nhưng tôi không thực sự chắc chắn nếu tôi có thể sử dụng const char* hoặc nếu tôi tốt hơn nên sử dụng std::string. Bên cạnh câu hỏi đầu tiên, làm điểm trỏ char cho các phân đoạn bộ nhớ có cùng kích thước không?Khởi tạo cấu trúc mảng và chuỗi ký tự

struct qinfo 
{ 
    const char* name; 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, 
    {"QTESTLONGNAME", 2}, 
    {"QTEST2", 3}, 
    {"QIEC", 4} 
}; 
+1

Tôi sẽ ở lại 'char const *'. Bạn tốt hơn không chuyển sang 'std :: string' cho điều đó, trừ khi bạn muốn bị fiasco khởi tạo tĩnh. –

Trả lời

2

Vâng, có vẻ ổn. Rõ ràng là bạn sẽ không thể sửa đổi bất kỳ chuỗi tên nào sau đó (mặc dù bạn có thể thay đổi các con trỏ trỏ đến các chuỗi khác nhau nếu bạn cần). Dung lượng lưu trữ cho mỗi chuỗi const sẽ chỉ là số lượng cần thiết và thường sẽ là chỉ đọc.

2

Có vẻ tốt, kích thước bộ nhớ cho các chuỗi sẽ khác với mảng char * khởi tạo như vậy sẽ được phân bổ kích thước khác nhau. Trình biên dịch sẽ chỉ phân bổ đủ không gian để chứa các ký tự sau đó thêm "\ 0" để chấm dứt chuỗi.

+0

@ markh44 Điểm công bằng, đã chỉnh sửa phản hồi. – shuttle87

1

Ok vì các chuỗi ký tự có thời lượng lưu trữ tĩnh. Không cần sử dụng std::string trong trường hợp này vì nó sẽ liên quan đến phân bổ bộ nhớ động khi chạy.

2

Khởi tạo là tốt nhưng char * sẽ trỏ đến các khối bộ nhớ có kích thước khác nhau khi chúng cần giữ các chuỗi có độ dài khác nhau. Đối với câu hỏi khác của bạn, nếu bạn muốn đảm bảo rằng chuỗi được chỉ định bởi thành viên struct vẫn giữ nguyên sau khi khởi tạo, bạn nên sử dụng const std :: string (Tôi bỏ qua các hack ở đây). Để thực hiện tương tự với con trỏ char, bạn cần khai báo nó là

const char* const 

tức là cả giá trị con trỏ và giá trị được trỏ đến là const.

0

Mã của bạn là tốt, nhưng các chuỗi sẽ có số lượng bộ nhớ khác nhau, có thể chỉ đọc.

Để trả lời những câu hỏi tu từ, một sự điều chỉnh nhỏ cho struct sẽ cho phép sửa đổi các dây và sửa chữa các bố trí bộ nhớ (vẫn còn nền tảng cụ thể, tất nhiên) độc đáo:

struct qinfo 
{ 
    char name[50]; // string lives inside the struct 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, // the literals are used to initialize the char array 
    {"QTESTLONGNAME", 2}, // they should not be otherwise 
    {"QTEST2", 3},  // compiled into the program 
    {"QIEC", 4} 
}; 
0

có vẻ ok cho tôi . Không thấy gì sai.

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