2013-06-14 52 views
7
int main() 
{ 
     char *x = "HelloWorld"; 
     char y[] = "HelloWorld"; 

     x[0] = 'Z'; 
     //y[0] = 'M'; 

     return 0; 
} 

Trong chương trình trên, HelloWorld sẽ ở phần chỉ đọc (ví dụ bảng chuỗi). x sẽ trỏ đến phần chỉ đọc đó, do đó, cố gắng sửa đổi các giá trị đó sẽ là hành vi không xác định.Chuỗi trong tham số chức năng

Nhưng y sẽ được cấp phát trong ngăn xếp và HelloWorld sẽ được sao chép vào bộ nhớ đó. do đó, sửa đổi y sẽ hoạt động tốt. String literals: pointer vs. char array

Đây là câu hỏi của tôi:

Trong chương trình sau, cả hai char *arrchar arr[] nguyên nhân lỗi segmentation nếu nội dung được sửa đổi.

void function(char arr[]) 
//void function(char *arr) 
{ 
    arr[0] = 'X'; 
}   
int main() 
{ 
    function("MyString");  
    return 0; 
} 
  1. Điểm khác biệt trong ngữ cảnh tham số chức năng?
  2. Không có bộ nhớ nào được phân bổ cho tham số chức năng ??

Hãy chia sẻ kiến ​​thức của bạn.

+0

có thể trùng lặp của [mảng Sizeof được truyền dưới dạng tham số] (http: // stackoverflow.com/questions/1328223/sizeof-array-pass-as-tham số) – delnan

+2

Không thực sự liên quan đến một cuộc thảo luận về kích thước của tham số mảng. Đây là về const-ness của chuỗi literals vs mảng ký tự, mà chủ yếu là không liên quan đến kích thước. –

Trả lời

17

Bên trong danh sách tham số chức năng, char arr[] hoàn toàn tương đương với char *arr, vì vậy cặp định nghĩa và cặp khai báo tương đương nhau.

void function(char arr[]) { ... } 
void function(char *arr) { ... } 

void function(char arr[]); 
void function(char *arr); 

Vấn đề là bối cảnh gọi điện. Bạn đã cung cấp chuỗi ký tự cho hàm; chuỗi chữ có thể không được sửa đổi; chức năng của bạn đã cố gắng sửa đổi chuỗi ký tự mà nó đã được đưa ra; chương trình của bạn đã gọi hành vi không xác định và bị lỗi. Tất cả hoàn toàn kosher.

Xử lý các chuỗi ký tự như thể chúng là static const char literal[] = "string literal"; và không sửa đổi chúng.

+0

Bạn thậm chí có thể nói 'static const char' để có thời gian lưu trữ chính xác. – ouah

+0

True ... Tôi sẽ cập nhật để khớp với ... –

+1

Tiêu chuẩn C++, trên thực tế, không chỉ định các chuỗi ký tự là 'const'. Thật không may, các tiêu chuẩn C không, có lẽ vì điều này sẽ phá vỡ quá nhiều mã di sản mà, trong khi không sửa đổi các literals, là cẩu thả trong các tuyên bố của nó. – microtherion

6
function("MyString"); 

cũng tương tự như

char *s = "MyString"; 
function(s); 

"MyString" là trong cả hai trường hợp một chuỗi chữ và trong cả hai trường hợp chuỗi là unmodifiable.

function("MyString"); 

chuyển địa chỉ của chuỗi ký tự thành function làm đối số.

+0

Trong trường hợp đầu tiên, 'HelloWorld' chỉ là chuỗi ký tự trong trường hợp' char arr [] '. đúng?? – Jeyaram

+1

Trong đoạn mã đầu tiên, chuỗi ký tự cho 'y' là một bộ khởi tạo được sao chép vào ngăn xếp. Nếu hàm được gọi nhiều lần, mảng sẽ được khởi tạo trên mỗi lời gọi, có lẽ sử dụng bộ khởi tạo không đổi từ một nơi khác. Mặc dù mảng này có thể sửa đổi được. –

1

char * arr; tuyên bố trên ngụ ý rằng arr là một con trỏ ký tự và nó có thể trỏ đến một ký tự hoặc chuỗi ký tự

& char arr []; tuyên bố trên ngụ ý rằng arr là chuỗi ký tự và có thể lưu trữ nhiều ký tự nhất có thể hoặc thậm chí một nhưng sẽ luôn dựa vào ký tự '\ 0' do đó tạo thành chuỗi (ví dụ char arr [] = "a" tương tự char arr [] = {'a', '\ 0'})

Nhưng khi được sử dụng làm tham số trong hàm được gọi, chuỗi được truyền được lưu trữ ký tự theo ký tự trong các đối số chính thức không có sự khác biệt.

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