2012-01-04 47 views
86

thể trùng lặp:
Memory Allocation char* and char[]Làm thế nào để khai báo chuỗi trong C

bất cứ ai có thể giải thích cho tôi một sự khác biệt giữa các dòng mã

char *p = "String"; 
char p2[] = "String"; 
char p3[7] = "String"; 

Trong trường hợp những gì là những gì tôi có nên sử dụng từng điều trên không?

+26

Điều cuối cùng là tràn bộ đệm, vì vậy rất hay. – Dan

+3

Ví dụ thứ ba của bạn phải là 'p3 [6]': bạn phải tính đến số 0 – fge

+18

@fge cuối cùng: cần 7 thực tế. – Mat

Trả lời

34

This link phải thỏa mãn sự tò mò của bạn.

Về cơ bản (quên ví dụ thứ ba của bạn xấu), sự khác nhau giữa 1 và 2 là 1 phân bổ không gian cho một con trỏ tới mảng.

Nhưng trong mã, bạn có thể thao tác chúng như con trỏ tất cả cùng một điều duy nhất, bạn không thể phân bổ lại thứ hai.

20

Bạn không nên sử dụng thứ ba vì sai. "String" mất 7 byte, không phải là 5.

Đầu tiên là con trỏ (có thể được gán lại cho một địa chỉ khác), hai cái kia được khai báo là mảng và không thể được gán lại cho các vị trí bộ nhớ khác nhau (nhưng nội dung của chúng có thể thay đổi, sử dụng const để tránh điều đó).

+5

'char p3 [5] =" String ";' trong khi nguy hiểm không sai và nó hợp lệ trong C (nhưng không trong C++) – ouah

+5

@ouah - đó là sai. Nó có thể vượt qua biên dịch, nhưng nó vẫn ** sai **. – littleadv

+4

đây là định nghĩa tuân thủ nghiêm ngặt đối với một đối tượng. Một chương trình tuân thủ nghiêm ngặt không phải là "sai" về C. – ouah

7
char *p = "String"; means pointer to a string type variable. 

char p3[5] = "String"; có nghĩa là bạn đang xác định trước kích thước của mảng để bao gồm không quá 5 phần tử. Lưu ý rằng, đối với chuỗi null "\ 0" cũng được coi là một element.So, tuyên bố này sẽ cung cấp cho một lỗi kể từ khi số phần tử là 7 vì thế nó nên là:

char p3[7]= "String"; 
27

Strings trong C được biểu diễn như mảng ký tự.

char *p = "String"; 

Bạn đang tuyên bố một con trỏ trỏ đến một chuỗi được lưu trữ một số nơi trong chương trình của bạn (sửa đổi chuỗi này là hành vi không xác định) theo ngôn ngữ lập trình C 2 ed.

char p2[] = "String"; 

Bạn đang tuyên bố một mảng của char khởi tạo với chuỗi "String" lại để trình biên dịch công việc để đếm kích thước của mảng.

char p3[5] = "String"; 

Bạn đang khai báo một mảng có kích thước 5 và khởi tạo nó bằng "Chuỗi". Đây là lỗi gây ra "Chuỗi" không phù hợp với 5 yếu tố.

char p3[7] = "String"; là khai báo chính xác ('\ 0' là ký tự kết thúc trong chuỗi c).

http://c-faq.com/~scs/cclass/notes/sx8.html

+0

Chỉ cần lưu ý rằng liên kết đã được cập nhật thành http://c-faq.com/charstring/index.html –

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