代码之家  ›  专栏  ›  技术社区  ›  rzetterberg

Free()返回的字符指针没有从内存中删除它?

  •  1
  • rzetterberg  · 技术社区  · 14 年前

    基本上问题归结为:

    我对C很陌生,所以在处理保存文本内容的变量的内存时,可能有问题。

    我尝试使用char[(ftell(file))而不是malloc和char*,但是函数没有返回任何内容。这可能是因为它是一个局部变量,当函数返回时会被释放,对吧?

    下面是我的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include "data/filesystem/files.h"
    
    int main(){
        char *filebuffer = retrieve_file_content("assets/test.txt");
        printf("%s", filebuffer);
        free(filebuffer);
        printf("%s", filebuffer);
        return 0;
     }
    

    文件.c:

    #include <stdio.h>
    #include <stdlib.h>
    
    char *retrieve_file_content(char* path){
        FILE *file;
        file = fopen(path, "r");
        if(file){
            fseek(file, 0L, SEEK_END);
            char *filebuffer = malloc(ftell(file));
            if(filebuffer == NULL){ return NULL; }
            fseek(file, 0L, SEEK_SET);
            int i = 0;
            int buffer = getc(file);
            while(buffer != EOF){
                filebuffer[i] = buffer;
                buffer = getc(file);
                i++;
            }
            fclose(file);
            return filebuffer;
        }else{
            return NULL;
        }
    }
    

    test.txt文件:

    heheasdasdas
    

    输出:

    heheasdasdas
    heheasdasdas
    

    提前谢谢!

    3 回复  |  直到 14 年前
        1
  •  10
  •   Armen Tsirunyan    14 年前

    free只表示有问题的内存可以重新分配,这意味着它可以重用。但它不会将释放的内存设置为任何值。你的例子就是所谓的UB(未定义的行为)。具有未定义行为的程序在技术上可以做任何事情-包括错误/奇怪的行为、良好的行为或通过skype订购比萨饼:)

        2
  •  3
  •   sharptooth    14 年前

    你所观察到的是未定义的行为。这次对你有用,下次可能会崩溃。别这么做。

    free() 内存块所有权被传递给C运行时,并且存储在块中的数据不会被修改(后者是出于性能原因而完成的)。碰巧块仍然映射到进程内存中,所以对您来说,它看起来可以安全地读取它。但是,根据多种情况,这样做可能会导致程序崩溃或导致程序读取更改的数据或任何其他后果。永远不要试图访问已经存在的内存 自由() d。

        3
  •  1
  •   Fred Foo    14 年前

    程序的行为是未定义的:C标准没有说明在 free malloc 可以用它。有些人将其返回到操作系统中,但只有用于小型计算机的C实现才可能这样做。有些人会抹去它,但只有高安全性的实现才有可能做到这一点。

    一、 e:你的程序的行为完全取决于巧合,明天/一年中的某一天/满月时可能不起作用。