2011-12-09 23 views
5
void main() { 
    void strrev(char *); 
    char *p="GOOd"; 
    strrev(p); 
    printf("%s",p); 
} 

void strrev(char *str) { 
    char temp, *end_ptr; 
    if(str == NULL || !(*str)) return; 
    end_ptr = str + strlen(str) - 1; 

    while(end_ptr > str) 
    { 
     temp = *str; 
     *str = *end_ptr; 
     *end_ptr = temp; str++; 
     end_ptr--; 
    } 
} 

tôi đang nhận được các phân khúc lỗi thất bại bất cứ ai có thể giúp tôi hiểu làm thế nào để sắp xếp nó ra ...nhận được "phân khúc thất bại" lỗi trong việc thực hiện chức năng strrev

Trả lời

5

Một vấn đề là trong những điều sau đây:

char *p = "GOOd"; 

trình biên dịch được phép đặt các chuỗi chữ trong bộ nhớ chỉ đọc.

Mọi nỗ lực sửa đổi chuỗi được trỏ đến bởi p dẫn đến hành vi không xác định.

Hãy thử thay đổi dòng trên để:

char p[] = "GOOd"; 

tôi không thấy bất cứ điều gì sai với strrev() chức năng riêng của mình.

+0

để trao đổi trực tiếp trong chuỗi là không thể? – sarsarahman

+0

@ S.A.Rahman: Đó là, miễn là bạn đang sử dụng một cách thích hợp để cấp phát bộ nhớ cho chuỗi (ví dụ: 'char p [] =" GOOd "' hoặc 'malloc' /' strdup'). – NPE

8

Tuyên bố:

char *p = "GOOd"; 

Xác định chuỗi chữ "TỐT", được trỏ bằng một con trỏ p.

Bạn đang cố gắng sửa đổi chuỗi ký tự này thông qua hàm strrev dẫn đến Hành vi không xác định (UB) và sự cố.

Sự cố với chuỗi ký tự là chúng được lưu trữ ở vị trí bộ nhớ chỉ đọc (Thực hiện được xác định) và chương trình người dùng không được phép thay đổi điều đó.Nếu chương trình cố gắng làm như vậy, nó gây ra UB.

Vì vậy, thay vì sử dụng chuỗi ký tự Bạn nên sử dụng mảng.

Bạn nên sử dụng:

char p[] = "GOOd"; 
+0

cảm ơn đã làm ... nhưng wat tôi nên học hỏi từ sai lầm này ... và thậm chí có bao nhiêu trường hợp khác loại lỗi (UB) bị bệnh? – sarsarahman

+0

@ SARahman: Có rất nhiều kịch bản dẫn đến tiêu chuẩn UB. C rõ ràng đề cập đến họ như vậy nhưng trải nghiệm IMHO là cách để đi về nó, Bạn thử mọi thứ, Bạn gặp khó khăn, cố gắng tìm lỗi, đặt câu hỏi ở đây nếu bạn không thể nhận được bất kỳ sự giúp đỡ. Bạn làm cho những sai lầm, bạn học hỏi từ họ, Với thực tế bạn sẽ biết những gì các kịch bản phổ biến mà gây ra UB. –

+0

nếu chuỗi được định nghĩa là char * p = "GOOd"; thì hàm thư viện chuẩn hoạt động như thế nào? – sarsarahman

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