Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Tại sao bị Segmentation fault ?

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Question Tại sao bị Segmentation fault ?

    Hi all, mình có code sau nhưng ko hiểu sao lại bị Segmentation fault

    Code:
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
    char *mang="today";
    char *mang2="is the best day";
    
    printf("gia tri mang 1 : %s\n",mang);
    printf("gia tri mang 2 : %s\n",mang2);
    
    strcat(mang,mang2);
    printf("gia tri mang sau khi nhap lai : %s\n",mang);
    }
    Rõ ràng mình có thể dùng 2 biến mang & mang2 để printf ra được, nhưng khi dùng strcat để nhập biến mang & mang2 lại thì lại bị Segmentation fault. Vậy là sao nhỉ ?

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Bạn không cấp đủ bộ nhớ cho mang nên ko thể nối thêm mang2 vào.

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Nguyên nhân xảy ra lỗi là do biến con trỏ "mang" trỏ tới vùng nhớ vừa đủ để lưu chữ "today"thôi. Nếu bạn lấy nội dung của chuỗi mang2 nhập vào chuỗi mang thì nội dung mới sẽ đè lên vùng nhớ của biến khác. Cách sửa lại là thế này :

    C++ Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3.  
    4. int main()
    5. {
    6.     char *mang="today";
    7.     char *mang2="is the best day";
    8.     char mang3[100];
    9.  
    10.     printf("gia tri mang 1 : %s\n",mang);
    11.     printf("gia tri mang 2 : %s\n",mang2);
    12.  
    13.     strcpy(mang3,mang);
    14.     strcat(mang3,mang2);
    15.     printf("gia tri mang sau khi nhap lai : %s\n",mang3);
    16. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Hi all, mình hiểu rồi nhưng mình có 1 thắc mắc khác là tại sao cũng y chang vd trên nhưng nếu ở đây ta ko dùng 2 biến con trỏ để chứa string mà dùng 2 mảng để chứ string thì lại ko bị lỗi ?

    tức code như sau :

    Code:
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
    char mang[]="today";
    char mang2[]="is the best day";
    
    printf("gia tri mang 1 : %s\n",mang);
    printf("gia tri mang 2 : %s\n",mang2);
    
    strcat(mang,mang2);
    printf("gia tri mang sau khi nhap lai : %s\n",mang);
    }
    Thanx mọi người

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Về lý thuyết là vẫn có lỗi đó bạn vì * và [] trong trường hợp này là như nhau, nếu trình biên dịch ko phát hiện lỗi thì chứng tỏ nó chưa tốt. Mình dùng VC6 thấy nó báo lỗi ầm ầm.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Mặc định Tại sao bị Segmentation fault ?

    Ra là vậy, mình compile bằng gcc trên CentOS 5.2

    Thanx bạn

Các đề tài tương tự

  1. Mã nguồn C Lỗi Lỗi segmentation fault do array quá dài?
    Gửi bởi latruyenvl trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 27-04-2013, 02:46 PM
  2. Hàm xử lý Xâu chạy sai, báo lỗi: Segmentation fault
    Gửi bởi xonefmBKA trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 26-11-2011, 11:25 PM
  3. lỗi segmentation fault bài về xâu kí tự
    Gửi bởi pentest trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 45
    Bài viết cuối: 07-05-2011, 07:24 PM
  4. Kỹ thuật C Lỗi segmentation fault xảy ra khi nào ?
    Gửi bởi nmt1402 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 01-04-2011, 05:33 PM
  5. Lỗi segmentation fault, làm sao sửa?
    Gửi bởi lamhaianh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 12-04-2010, 07:57 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn