Mã ở trên sẽ gây ra sự cố.
Ví dụ đầu tiên được gọi là phân bổ chuỗi tĩnh và định nghĩa. Đối với các biến thông thường như int
, v.v ... và các loại dữ liệu không phải chuỗi, một tuyên bố như vậy sẽ phân bổ dữ liệu trên ngăn xếp. Trong trường hợp chuỗi được khởi tạo thông qua các chuỗi ký tự (ví dụ: "stack"
), nó được cấp phát trong phần chỉ đọc của bộ nhớ.
Không nên sửa đổi chuỗi vì nó sẽ được lưu trữ trong phần chỉ đọc của bộ nhớ. Con trỏ chính nó có thể được thay đổi để trỏ đến một vị trí mới.
ví dụ:
char strGlobal[10] = "Global";
int main(void) {
char* str = "Stack";
char* st2 = "NewStack";
str = str2; // OK
strcpy(str, str2); // Will crash
}
Để an toàn, bạn nên thực sự phân bổ như một con trỏ đến dữ liệu const, ví dụ:
const char* str = "Stack"; // Same effect as char* str, but the compiler
// now provides additional warnings against doing something dangerous
Thứ hai được gọi là phân bổ năng động, cấp phát bộ nhớ trên đống, không phải là ngăn xếp. Chuỗi có thể được sửa đổi mà không gặp rắc rối. Tại một số thời điểm, bạn cần giải phóng bộ nhớ được cấp phát động này thông qua lệnh free()
.
Có phương tiện phân bổ chuỗi thứ ba, là phân bổ tĩnh trên ngăn xếp. Điều này cho phép bạn sửa đổi nội dung của mảng đang giữ chuỗi, và nó được phân bổ tĩnh.
char str[] = "Stack";
Nói tóm lại:
Example: Allocation Type: Read/Write: Storage Location:
================================================================================
const char* str = "Stack"; Static Read-only Code segment
char* str = "Stack"; Static Read-only Code segment
char* str = malloc(...); Dynamic Read-write Heap
char str[] = "Stack"; Static Read-write Stack
char strGlobal[10] = "Global"; Static Read-write Data Segment (R/W)
Bạn cũng nên đọc lên về cách dữ liệu được phân đoạn cho các ứng dụng trong hệ điều hành hiện đại. Nó thực sự sẽ làm tăng sự hiểu biết của bạn về cách mã của bạn đang được xây dựng.
Tài liệu tham khảo
- liệu Segment, Accessed 2013/04/15,
<http://en.wikipedia.org/wiki/Data_segment>
- Mã Segment, Accessed 2013/04/15,
<http://en.wikipedia.org/wiki/Code_segment>
Got it, thanks. – VishalDevgire
Tôi cũng sẽ thêm một biến thể: 'char str [] =" Stack "' ... –
@ValeriAtamaniouk Và bạn sẽ chính xác. Sẽ udpate. Cảm ơn vì đã nhắc tôi. – DevNull