2010-10-10 30 views

Trả lời

51

Giá trị đầu tiên phân bổ một mảng gồm 10 char. Thứ hai phân bổ một char khởi tạo đến 10

Hoặc:

Đầu tiên nên được thay thế bằng std::vector<char>, thứ hai nên được đặt vào một con trỏ thông minh.

+3

Bạn có thể cho chúng tôi biết về con trỏ thông minh không? –

+1

@Green: Eh, [this] (http://stackoverflow.com/questions/94227/smart-pointers-or-who-owns-you-baby) là một khởi đầu tốt. – GManNickG

+0

+1 từ tôi. Tôi luôn luôn phấn nó lên đến một "đi qua ignoramus" khi tôi thấy có một downvote ẩn danh cho một câu trả lời hoàn toàn chính xác. –

14
new char[10]; 

động phân bổ một char [10] (mảng của char, chiều dài 10), với giá trị không xác định, trong khi

new char(10); 

một lần nữa, tự động phân bổ một char duy nhất, với một giá trị số nguyên của 10.

0

Điều đầu tiên sẽ tạo một mảng. Nhưng tôi đoán câu hỏi của bạn chủ yếu là câu hỏi thứ hai. Mã của bạn có thể sử dụng nó như là một ký tự hợp lệ, xem xét:

char * x ; 
cin >> *(x=new char()) ; 

sẽ làm cho một nhân vật tự động và sau đó đọc nó từ stdin.

+4

Chỉ vì một đối tượng có kích thước của một không có nghĩa là nó là một char. Ngoài ra, làm thế nào bạn có thể xóa biến đó? (Đừng tự động phân bổ khi bạn không cần phải.) "Đừng quên xóa" -> Mã lỗi C++. – GManNickG

+0

Bạn nói đúng, nhưng tôi chỉ muốn cho bạn bè của chúng tôi thấy rằng những người tạo ra C++, đã thực hiện việc này cho một số mục đích. Tôi không nên sử dụng nó với cin và không có tham chiếu đến nó. –

6
char *a = new char[10]; 
... 
delete [] a; 

Tự động phân bổ và giải quyết 10 khe bộ nhớ liền kề có thể được sử dụng để lưu trữ ký tự.

char *a = new char(10); 
... 
delete a; 

Trên đây tự động phân bổ và deallocates một khe cắm bộ nhớ được khởi tạo với giá trị số nguyên 10, tương đương với giá trị char '\n'.


KHÔNG sử dụng std::vector<T> nếu bạn không hiểu đầu tiên về con trỏ. Biết cách phân bổ bộ nhớ và con trỏ hoạt động như thế nào sẽ làm cho bạn trở thành một lập trình viên tốt hơn.

+2

Điều này làm gì thêm các câu trả lời hiện có? Và nửa thứ hai của bạn hoàn toàn là ý kiến, và thực sự khá bất đồng trong cộng đồng C++ hiện đại. Sẽ tốt hơn nếu giao cho mọi người hộp đen, * sau đó * chỉ cho họ cách thức hoạt động và lý do chúng tôi sử dụng chúng. Quản lý bộ nhớ thủ công là xấu C++ anyway, tại sao bắt đầu bằng cách dạy người xấu C++? – GManNickG

+0

10 khe cắm bộ nhớ là tiếp giáp, bình luận về std :: vector, (char) 10 == '\ n' ~~ Đừng bỏ phiếu cho tôi chỉ vì tôi làm tổn thương cảm xúc của bạn. – Squirrelsama

+0

Bạn đã chỉnh sửa trong nửa sau, tôi đã chỉnh sửa nhận xét của mình để khớp. Ngoài ra, cả ba câu trả lời hiện có đều nói rằng đó là một "mảng". Mảng luôn luôn tiếp giáp. Ngoài ra, ''\ n'' không nhất thiết phải là 10, nó phụ thuộc vào bộ ký tự của bạn. – GManNickG

1

Tôi thà sử dụng:

size_t size = 10; //or any other size 
std::string buff(size, 0); //or: std::string buff(size, '\0'); 

Bây giờ nếu bạn phải sử dụng char * buff, sau đó bạn có thể sử dụng:

&buff[0] 

Khi bạn cần phải sử dụng const char * sau đó bạn có thể sử dụng :

buff.c_str() 

Lợi thế lớn nhất là bạn không cần phải giải quyết bộ nhớ, hãy chăm sóc điều này cho bạn. Ưu điểm tiếp theo là bạn có thể sử dụng tất cả các chức năng chuỗi stl

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