2009-12-10 80 views
15

Tôi hy vọng rằng cả hai vectơ sau có đại diện cùng trong RAM:C - Sự khác biệt giữa "char var []" và "char * var"?

char a_var[] = "XXX\x00"; 
char *p_var = "XXX"; 

Nhưng kỳ lạ, một cuộc gọi đến một hàm thư viện các loại f(char argument[]) crushs các ứng dụng đang chạy nếu tôi gọi nó bằng cách sử f(p_var). Nhưng sử dụng f(a_var) là Ok!

Tại sao?

Trả lời

26

Đầu tiên tạo một mảng char chứa chuỗi. Nội dung của mảng có thể được sửa đổi. Thứ hai tạo ra một con trỏ ký tự trỏ đến một chuỗi ký tự. Không thể sửa đổi các chuỗi ký tự.

+0

Như tôi biết, trong ANSI C tất cả có thể được sửa đổi – psihodelia

+15

Bạn biết sai. Tiêu chuẩn cấm các sửa đổi của chuỗi ký tự. –

+0

Ok, cảm ơn! Bây giờ, tôi sẽ nhớ nó mãi mãi :) – psihodelia

1

Khi được đoán, hàm f sửa đổi nội dung của chuỗi được truyền cho nó.

+0

có, nó sửa đổi. nhưng tại sao f (p_var) làm cho lòng và f (a_var) không? – psihodelia

+1

vì: char * p_var = "XXX"; Không thể sửa đổi. –

0

Mảng có thể được xử lý (thường) như con trỏ nhưng điều đó không có nghĩa là chúng luôn có thể hoán đổi cho nhau. Như người kia nói, p_var của bạn trỏ đến một chữ cái, cái gì đó tĩnh mà không thể thay đổi được. Nó có thể trỏ đến một thứ khác (ví dụ: p_var = & a_var [0]) nhưng bạn không thể thay đổi giá trị ban đầu mà bạn đã chỉ định bằng dấu ngoặc kép ....

Một vấn đề tương tự là khi bạn xác định biến trong một tệp và sau đó sử dụng nó làm con trỏ.

Trân

1

Như những người khác nói, char *p_var = "XXX"; tạo ra một con trỏ đến một chuỗi chữ mà không thể thay đổi, vì vậy việc triển khai biên dịch được tự do tái sử dụng literals, ví dụ:

char *p_var = "XXX"; 
char *other = "XXX"; 

Một trình biên dịch có thể chọn tối ưu hóa điều này bằng cách lưu trữ "XXX" một lần trong bộ nhớ và làm cho cả hai con trỏ trỏ đến nó, thay đổi giá trị của chúng có thể dẫn đến hành vi không mong muốn, vì vậy đó là lý do bạn không nên sửa đổi nội dung của chúng.

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