2011-11-11 7 views
6

Occasionaly, tôi đã thực hiện một lỗi đánh máy ở một nơi mã của chương trình của tôi:Tôi có thể thực sự khởi tạo một mảng với các dấu ngoặc tròn không?

int a = 10; 
char* b = new char(a); 

Lỗi là rõ ràng: Tôi đã viết() thay vì []. Điều kỳ lạ là ... mã được biên dịch ok, nó chạy trong trình gỡ lỗi ok. Nhưng biên dịch .exe bên ngoài của trình gỡ rối bị rơi một lúc sau khi chức năng với những dòng này đã được thực thi.

Dòng thứ hai của mã có thực sự hợp pháp không? Và nếu có, trình biên dịch có ý nghĩa gì?

Trả lời

10

Đó là một char đơn có giá trị bằng số a, trong trường hợp này là 10. Con trỏ không chỉ trỏ tới mảng, bạn biết.

5

Bạn đang phân bổ đơnchar và chỉ định giá trị đó từ a. Nó không phân bổ một mảng nào cả.

Nó giống như kêu gọi các nhà xây dựng trong một biểu thức new cho bất kỳ loại khác:

std::string* s = new std::string("foo"); 
int* i = new int(10); 
std::vector<std::string>* v = new std::vector<std::string>(5, "foo"); 
2

char t(a) tạo ra một char địa phương khởi tạo với giá trị của a.
new char (a) tạo char được phân bổ động được khởi tạo với giá trị a.