2013-03-12 39 views
7

Tôi đang cố gắng loại bỏ const-ness khỏi biến (char *), nhưng vì một lý do nào đó khi tôi cố gắng thay đổi giá trị, giá trị ban đầu của biến const vẫn giữ nguyên .Xóa const-ness khỏi biến

const char* str1 = "david"; 
char* str2 = const_cast<char *> (str1); 
str2 = "tna"; 

bây giờ giá trị của thay đổi str2 nhưng giá trị gốc của str1 vẫn giữ nguyên, tôi đã tìm kiếm trên Google nhưng không thể tìm thấy câu trả lời rõ ràng.

khi sử dụng const_cast và thay đổi giá trị, liệu biến ban đầu của biến const có thay đổi không?

Trả lời

10

Loại str1const char*. Đây là charconst, không phải con trỏ. Tức là, đó là một con trỏ đến const char. Điều đó có nghĩa bạn không thể làm điều này:

str1[0] = 't'; 

Điều đó sẽ thay đổi giá trị của một trong những constchar s.

Bây giờ, những gì bạn đang làm khi bạn làm str2 = "tna"; đang thay đổi giá trị của con trỏ. Đó là tốt. Bạn chỉ đang thay đổi str2 để trỏ đến một chuỗi ký tự khác. Bây giờ str1str2 đang trỏ đến các chuỗi khác nhau.

Với phi bạn const con trỏ str2, bạn có thể làm str2[0] = 't'; - tuy nhiên, bạn sẽ phải hành vi không xác định. Bạn không thể sửa đổi thứ gì đó ban đầu được khai báo là const. Đặc biệt, chuỗi ký tự được lưu trữ trong bộ nhớ chỉ đọc và cố gắng sửa đổi chúng sẽ mang lại cho bạn sự bất hạnh khủng khiếp.

Nếu bạn muốn tham gia một chuỗi chữ và sửa đổi nó một cách an toàn, khởi một mảng với nó:

char str1[] = "david"; 

này sẽ sao chép các ký tự từ chuỗi chữ trên đến các mảng char. Sau đó, bạn có thể sửa đổi chúng theo ý thích của bạn.

+0

Được rồi, vậy có cách nào tôi có thể thay đổi giá trị của biến const char * bằng cách truyền không? –

+0

@DavidFaiz Bạn có thể sửa đổi con trỏ tốt mà không cần sử dụng. Bạn * không thể * sửa đổi 'char' nếu bạn đã đặt con trỏ trỏ vào một chuỗi ký tự, mà bạn có. Chuỗi ký tự là hằng số. Xem bản chỉnh sửa mới nhất của tôi để biết cách sao chép chuỗi ký tự thành một mảng. –

+0

yea vừa xem nó và đã hiểu! cảm ơn bạn rất nhiều vì đã trả lời nhanh! vì vậy về cơ bản tôi không thể sửa đổi chuỗi chữ nhưng chỉ sử dụng biến const char và trỏ đến một biến khác. –

3

str2 đơn giản chỉ là con trỏ. Và mã của bạn chỉ thay đổi giá trị của con trỏ, địa chỉ, không phải chuỗi mà nó trỏ tới.

Hơn nữa, những gì bạn đang cố gắng thực hiện dẫn đến hành vi không xác định và rất có thể sẽ dẫn đến lỗi thời gian chạy. Tất cả các trình biên dịch hiện đại sẽ lưu trữ chuỗi của bạn "david" trong bộ nhớ chỉ đọc. Nỗ lực sửa đổi bộ nhớ đó sẽ dẫn đến lỗi bảo vệ bộ nhớ.