Lỗi khi dùng fgets trong c

chương trình dưới đây dùng fgets để lấy chuỗi kí tự từ trong file rồi in lên console, nhưng khi lên console thì bị sai. mọi người tìm chỗ sai cho em với. tks mọi người.

#include <stdio.h>
int main(){
    FILE *taptin=NULL;
    char *s;
    taptin=fopen("C:\\Users\\pc\\Desktop\\file.txt","r");
    
    fgets(s,100,taptin);
    printf("%s",s);
    fclose(taptin);
    
    return 0;
}

Do chỗ này nè bạn. s này của bạn chỉ là con trỏ thôi, mà bạn lại chưa cấp vùng nhớ cho nó. s nó trỏ đến đâu thì trời mới biết. :slight_smile:

Vì thế khi fgets()s cũng có nghĩa là bạn đang xâm nhập vào một vùng nhớ trái phép, hoặc có thể vùng nhớ đó không tồn tại.

:point_right: Khắc phục:

  • Sửa thành char s[100];

  • Cấp phát cho nó: char *s = (char*)malloc(100 * sizeof(char));
    Và đừng quên free(s); sau khi dùng song. :slight_smile:

3 Likes

phần dưới này em có cấp phát động đâu sao nó vẫn chạy được vậy ạ?

#include <stdio.h>

int main ()
{
    char *s;
    fgets(s,100,stdin);
    printf("%s",s);

    return(0);
}

Chạy thì vẫn được, nhưng bản chất thì s của bạn đang truy cập vào vùng nhớ bỏ không. Nếu có một chương trình khác sử dụng vùng nhớ đó thì s sẽ bị thay đổi.

Việc này cũng như bạn đang sử dụng một khu đất hoang để xây nhà vậy, mặc dù bạn chưa xin chính phủ nhà nước (Hệ điều hành) quyền sử dụng khu đất đó.

Đến một này nhà của bạn bị phá đi và được xây thành một khu chung cư trong khi không có bất kỳ một thông báo nào trước với bạn, mà chủ sở hữu lại không phải là bạn.

Đó là điều hiển nhiên vì khu đất đó vốn không phải của bạn. :slight_smile:


Cõ lẽ việc này diễn ra nhanh hay chậm thì phụ thuộc vào RAM của bạn. Nhưng nếu bạn cho chương trình Sleep vài giây (hoặc vài trục giây) sau khi nhập rồi mới in ra thì chuỗi s sẽ không như bạn nhập. :slight_smile:

4 Likes

cảm ơn anh nhé :smiley:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?