【问题标题】:Using fgets() with char* type使用带有 char* 类型的 fgets()
【发布时间】:2013-12-10 11:32:06
【问题描述】:

我有一个关于使用 fgets() 和 char* 字符串的简单问题。

....
char *temp;
FILE fp=fopen("test.txt", "r");

fgets(temp, 500, fp);
printf("%s", temp);
....

这段代码运行不好。

但在我将char *temp 修改为char temp[100]; 后,代码运行良好。

这两者有什么区别?

当我用谷歌搜索时,有人说必须使用 malloc() 将内存分配给char *...

但我无法理解。

【问题讨论】:

  • 如果您不分配内存,指针将指向什么?要记住这一点,在声明后立即将 NULL 分配给指针。释放指针的内存时同样如此。在删除后也分配 NULL。没有分配内存的指针是一个非常常见的错误,会给你带来可怕的分段错误。

标签: c string char fgets


【解决方案1】:

char *temp 未初始化,也就是说,它没有指向有效的内存。要么将其设为数组 (char temp[]),要么使用 malloc 为其分配内存。

【讨论】:

    【解决方案2】:

    char *temp 只是一个指针。一开始它不指向任何东西,可能它有一个随机值。

    fgets() 从 fp 读取 500 个字节到这个临时指针指向的内存地址!所以,它可以覆盖东西,它可以产生分段错误,并且只有极低的机会才能正常工作。

    但是 char temp[500] 是一个 500 字节长的数组。这意味着,编译器在您的进程开始时(或在您的函数调用时)进行分配。因此这 500 字节将是可用的 500 字节,但它有一个代价:你不能重新分配、调整大小、释放等等。

    谷歌想从你这里得到什么,是这样的:

    char *temp = (char*)malloc(500);
    

    还有一个

    free(temp);
    

    在你不再需要这个之后。

    【讨论】:

    • 在 C 中不需要转换 malloc/calloc/realloc 的结果,也不推荐:stackoverflow.com/a/605858/694576
    • 直到我这样做只是为了避免 gcc 警告,但他的论点很强大。
    【解决方案3】:

    当我们写作时

    char *temp ; 
    

    这意味着temp 是指向char 的未初始化指针,即目前它不包含任何地址。

    在使用fgets 时,您必须传递一个字符串,其中将从文件指针读取的字节被复制。 link 由于temp 未初始化,fgets 看起来像这样

    fgets(<no string> , 500 , fp ) ;
    

    这是无效的。

    因此,我们应该给出可以形成为的初始化字符串:

    1) char *temp = malloc(sizeof(500)) ;
    or
    2) char temp[500] ;
    

    因此,如果我们将初始化的字符串传递给 fgets ,它看起来像

    fgets( < some string > , 500 , fp) ;
    

    【讨论】:

    • 这是缓冲区溢出。 malloc(sizeof(500)) 将分配大约 4 个字节,而不是 500 个。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多