2011-01-13 43 views
31

Sự khác biệt giữa hai điều này trong việc phân bổ bộ nhớ.Phân bổ bộ nhớ char * và char []

char *p1 = "hello"; 
char p2[] = "hello"; 
+13

Đầu tiên phải là 'const char *'! – rubenvb

+0

'p1' mất 4 hoặc 8 byte (bắt buộc để lưu trữ địa chỉ bộ nhớ) phụ thuộc vào nền tảng. 'p2' mất 6 byte (= 5 byte cho chuỗi' hello' + 1 byte cho ký tự kết thúc null). – RBT

Trả lời

35

Người đầu tiên tạo ra một con trỏ biến (bốn hay tám byte dung lượng lưu trữ tùy thuộc vào nền tảng này) và lưu trữ một địa điểm của một chuỗi chữ đó, thứ hai tạo ra một mảng sáu nhân vật (bao gồm cả zero terminator byte) và sao chép chữ ở đó.

Bạn sẽ nhận được cảnh báo trình biên dịch trên dòng đầu tiên vì chữ là const.

+0

Trường hợp chính xác là chuỗi ký tự lưu trữ? Là nó trong đống? – blitzkriegz

+10

Chuỗi ký tự thường được lưu trữ trong vùng bộ nhớ tách biệt với cả chồng và ('mới' /' xóa' được quản lý). Tùy thuộc vào nền tảng của bạn, khu vực này có thể được bảo vệ chống sao chép, vì vậy việc ghi vào nó sẽ làm hỏng chương trình. –

+0

Cảm ơn rất nhiều vì câu trả lời rõ ràng. – blitzkriegz

8

Đầu tiên là con trỏ không const đến dữ liệu const (chỉ đọc), thứ hai là mảng không phải const.

+0

Vì vậy, char * p1 = "hello" tương đương với char const * p1 = "hello"? – blitzkriegz

+3

@Mahatma: vâng, và điều này cũng giống như phiên bản dễ đọc và trực quan hơn: 'const char * p1 =" hello "'. –

+2

@Mahatma: có, nhưng điều đầu tiên là nguy hiểm: không có trình độ 'const', không có trình bảo vệ trình biên dịch nào cố gắng sửa đổi chuỗi ký tự, cho hành vi không xác định. –

6

Kể từ khi đầu tiên là một con trỏ không const để const (read-only) dữ liệu, thứ hai là một mảng không const, như Thánh Phaolô nói, bạn có thể viết:

p2[2]='A'; //changing third character - okay 

Nhưng bạn không thể viết:

p1[2]='A';//changing third character - runtime error! 
+1

Trường hợp thứ hai thực sự tệ hơn lỗi biên dịch; trình biên dịch sẽ rất có thể chấp nhận nó, cho hành vi thời gian chạy không xác định. –

+1

Điều đó không đúng - anh ta sẽ không nhận được lỗi biên dịch vì chuỗi ký tự không phải là const. Tuy nhiên, anh ta sẽ nhận UB. – Puppy

+0

@DeadMG: cố định. :-) – Nawaz

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