为什么免费不释放内存?

时间:2019-09-16 08:15:27

标签: c embedded

我是C语言的新手,我正在尝试使用Malloc动态分配内存,然后使用“ free”释放内存。

我已经尝试过在Google上进行搜索,但自从我刚开始学习它以来,到目前为止还没有任何意义。

#include <stdio.h>
#include <stdlib.h>

int main (){
    printf("Enter your name:");


    //Here I allocate enough memory for the "sir" array.

    //allocate memory
    char *sir = (char*) malloc (100 * sizeof(char));

    //scan string. I am scanning a name e.g.: John Smith
    scanf("%[^\n]", sir);
    //size of sir
    int size = strlen(sir);
    printf("String size with strlen = %d\n", size);

    //printing the string
    for(int i = 0; i < size; i++){
        printf(" %d = [%c] ", i ,sir[i]);
    }
    //Printing J o h n _ S m i t h
    //Here I release the memory allocated    

    //release memory
    free(sir);

    //print the string after releasing memory
    printf("\n\n");
    for(int i = 0; i < size; i++){
        printf(" %d = [%c] ", i ,sir[i]);
    }
    //Printing _ _ _ _ _ S m i t h

    //After the above loop, I still have some input as well as some memory which I can access.

    // I do not understand why free does not release whole memory.
    return 0;
}

我期望在free(sir)行之后,我尝试访问的内存为空/不可访问。

我明白这是错的吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这是预期的 undefined 行为。调用free之后,您的指针仍将指向相同的地址。现在,对malloc的另一个调用可以使用已释放的内存,否则将保留该内存。但是,如果没有任何内容写入该地址,则其内容将保持不变,并且由于指针仍指向该地址,因此可以打印该字符串。通常,free用于内存管理,而不是用于将内存设置为任何值。

永远不要在实际代码中这样做,免费使用后会带来巨大的安全风险。

edit:为澄清起见,即使没有写入任何内容,您也可能根本无法访问该内存。同样,没有办法事先知道。