Ví dụ đầu tiên không hoạt động khi bạn đi để xóa con trỏ. Chương trình này hoặc treo khi tôi thêm terminator null hoặc không có nó tôi nhận được:Tại sao phải trỏ đến một mảng char cần strcpy để gán các ký tự cho mảng của nó và việc gán ngoặc kép sẽ không hoạt động?
Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
từ Visual Studio 2008
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
Vì vậy, những gì đang xảy ra khi tôi sử dụng dấu ngoặc kép thay vì strcpy? Cả hai người trong số họ sẽ cout chuỗi hoàn hảo và trình gỡ rối không hiển thị bất cứ điều gì khác nhau.
Tôi giả sử bạn có nghĩa là 'xóa []' – MSalters
Bạn đã trả lời câu hỏi của riêng mình. strcpy() gán các ký tự cho mảng. = gán một mảng mới. Trình gỡ lỗi thực sự cho thấy một cái gì đó khác nhau. Giá trị của 'at' thay đổi trong một trường hợp và không phải trong trường hợp khác. – EJP
FYI, làm 'at =" tw ";' và sau đó 'tại [2] = '\ 0';' là thừa. '" tw "' tạo ra một chuỗi ký tự là * đã * null-chấm dứt. Bộ nhớ cho chuỗi "" tw "' trông giống như '['t' | 'w' | '\ 0'] '. Không chỉ vậy, nhưng 'at [2] = '\ 0';' cũng sẽ dẫn đến hành vi không xác định; '" tw "' tạo ra một chuỗi ký tự, là một chuỗi * chỉ đọc * mà là * không thể đọc được *, vì vậy việc viết vào chuỗi ký tự chỉ đọc này sẽ gọi hành vi không xác định. Để thực sự gán một cái gì đó theo cách này, bạn phải làm 'const char * at =" tw ";' sẽ tạo ra một chuỗi ký tự và có 'at' trỏ đến cùng một vị trí. – RastaJedi