2010-06-28 74 views
32
char * msg = new char[65546]; 

muốn khởi tạo 0 cho tất cả chúng. cách tốt nhất để làm điều này trong C + + là gì?cách khởi tạo mảng char?

+3

Cách tốt nhất là không bao giờ sử dụng 'mới' theo cách thủ công như thế. Sử dụng 'std :: vector'. – GManNickG

+0

memset hoặc calloc. – eemz

Trả lời

52
char * msg = new char[65546](); 

Nó được gọi là giá trị khởi tạo, và đã được giới thiệu trong C++ 03. Nếu bạn tình cờ thấy mình bị mắc kẹt trong một thập kỷ trước, thì bạn sẽ cần sử dụng std::fill() (hoặc memset() nếu bạn muốn giả vờ là C).

Lưu ý rằng điều này sẽ không hoạt động đối với bất kỳ giá trị nào khác 0. Tôi nghĩ rằng C++ 0x sẽ cung cấp một cách để làm điều đó, nhưng tôi là một chút đằng sau những lần vì vậy tôi không thể bình luận về điều đó.

CẬP NHẬT: có vẻ như sự ruminations của tôi về quá khứ và tương lai của ngôn ngữ không hoàn toàn chính xác; xem các bình luận để sửa chữa.

+0

+1 cho giải pháp lý tưởng :-). –

+0

Điều này hoạt động rất tốt vì 0 là giá trị tích phân mặc định cho 'char'. –

+5

@Eric, không liên quan gì đến OOP: S –

4
memset(msg, 0, 65546) 
+0

Hãy nhớ rằng '#include ' –

+0

Kích thước (char) có được là 1 không? Tôi đã không bao giờ nhìn thấy nó không được, nhưng trừ khi nó được đảm bảo bởi các tiêu chuẩn, tôi sẽ sử dụng 'memset (msg, 0,65546 * sizeof (char));' chỉ để chắc chắn. –

+9

@Paul: 'sizeof (char)' được đảm bảo là 1. –

6

Phương pháp này sử dụng chức năng 'C' memset và rất nhanh (tránh vòng lặp char-by-char).

const uint size = 65546; 
char* msg = new char[size]; 
memset(reinterpret_cast<void*>(msg), 0, size); 
+8

không cần thiết cho diễn viên, ngầm T * để void * được cho phép trong c + +, chỉ cần không ngầm void * để T * –

+5

... chưa kể rằng các diễn viên thích hợp ở đây sẽ là 'static_cast'. – avakar

+0

Và 'std :: fill' tốt hơn nhiều. Bất kỳ trình biên dịch hiện đại sẽ sử dụng 'memset' khi nó có thể, không sử dụng trong không nhất quán. – GManNickG

16

Cách "hầu hết C++" để thực hiện việc này sẽ là sử dụng std::fill.

std::fill(msg, msg + 65546, 0); 
+1

+1, (khá) an toàn và dễ đọc. Althrough Tôi thích & msg [0], & msg [65546] (tôi cũng nghĩ rằng 65536 là kích thước dự định =) –

8

cách tốt nhất để làm điều này trong C++ là gì?

Bởi vì bạn hỏi nó theo cách này:

std::string msg(65546, 0); // all characters will be set to 0 

Hoặc:

std::vector<char> msg(65546); // all characters will be initialized to 0 

Nếu bạn đang làm việc với các chức năng C mà chấp nhận char * hoặc const char *, sau đó bạn có thể làm:

some_c_function(&msg[0]); 

Bạn cũng có thể sử dụng phương thức c_str() trên std :: stri ng nếu nó chấp nhận const char * hoặc data().

Lợi ích của phương pháp này là bạn có thể làm mọi thứ bạn muốn làm với bộ đệm char phân bổ động nhưng an toàn hơn, linh hoạt hơn và đôi khi hiệu quả hơn (tránh cần phải tính toán lại chiều dài chuỗi tuyến tính, ví dụ). Hay nhất của tất cả, bạn không cần phải giải phóng bộ nhớ được phân bổ bằng tay, vì destructor sẽ làm điều này cho bạn.

+2

+1 để thực hiện một bước trở lại từ câu hỏi và gợi ý nên làm thế nào. –

14

Vắng mặt một lý do thực sự tốt để làm khác đi, tôi có thể sử dụng:

std::vector<char> msg(65546, '\0'); 
+6

+1 khi người dùng yêu cầu cách C++ tốt nhất. :-D – stinky472

1

Bạn có thể sử dụng một vòng lặp for. nhưng đừng quên char cuối cùng phải là một nhân vật vô giá trị!

char * msg = new char[65546]; 
for(int i=0;i<65545;i++) 
{ 
    msg[i]='0'; 
} 
msg[65545]='\0'; 
+0

Tôi khá chắc chắn OP muốn mảng được khởi tạo cho tất cả các số không (còn gọi là null) không cho tất cả ''0'' :-) –

0

Phương pháp C-like có thể không hấp dẫn như các giải pháp khác cho câu hỏi này, nhưng nói thêm ở đây cho đầy đủ:

Bạn có thể khởi với NULLs như thế này:

char msg[65536] = {0}; 

Hoặc để sử dụng số không, hãy xem xét các trường hợp sau:

char msg[65536] = {'0' another 65535 of these separated by comma}; 

Nhưng đừng dùng thử như not possible, vì vậy hãy sử dụng memset!

Trong trường hợp thứ hai, hãy thêm phần sau đây sau khi ghi nhớ nếu bạn muốn sử dụng msg làm chuỗi.

msg[65536 - 1] = '\0' 

Câu trả lời cho this question cũng cung cấp thêm thông tin chi tiết.

+0

@HJ: Đã chỉnh sửa, cảm ơn. OP muốn không, nếu sử dụng [ASCII] (http://www.theasciicode.com.ar/ascii-printable-characters/number-zero-ascii-code-48.html) '0' giống như Chr (48))? –

+0

Từ "zero" không rõ ràng khi bạn đang nói về một char, nhưng nó * thường * có nghĩa là null chứ không phải ký tự ASCII ''0''. Tôi tin rằng OP có nghĩa là một mảng của nulls chứ không phải là một mảng đầy đủ các ký tự số không, nếu chỉ vì sau này không có khả năng hữu ích. Nhưng nó không làm tổn thương câu trả lời của bạn để giải thích làm thế nào để làm cả hai. –

+0

... ngoại trừ việc tôi * nghĩ * đoạn mã thứ hai của bạn sẽ chỉ đặt một ''0'' vào mảng? Bạn đã thử nó chưa? –

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