1024-web1 发表于 2020-3-30 11:09:02

运行后这段代码,为啥我的vs编译器显示free前后没有变化??

#include<stdio.h>
#include<stdlib.h>
int main()
{
        int* ptr = NULL;
        ptr = (int*)malloc(sizeof(222));
        if (ptr == NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        printf("before free,ptr=%p\n", ptr);
        free(ptr);
        printf("after free,ptr=%p\n",ptr);
        return 0;

1024-web1 发表于 2020-3-30 11:18:30

而且每次运行输出ptr的结果都不一样,和上课小甲鱼老师讲的不一样啊

sunrise085 发表于 2020-3-30 12:18:29

free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释放之前,该空间一直归本程序使用,
释放掉之后,对应的空间可以被其他程序使用,之后再对该空间进行访问,可能就不是原来的值了。

1024-web1 发表于 2020-4-2 19:25:25

sunrise085 发表于 2020-3-30 12:18
free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释 ...

理论上是这样的课上说过,但是我释放后还是原来的数。没有变,而且每一次运行的结果都不一样,不信你试试这是源代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
        int* ptr = NULL;
        ptr = (int*)malloc(sizeof(int));
        printf("before free,ptr=%p\n", ptr);

        if (ptr == NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        printf("before free,ptr=%p\n", ptr);
        free(ptr);
        printf("after free,ptr=%p\n",ptr);
        return 0;
}

sunrise085 发表于 2020-4-3 12:00:21

1024-web1 发表于 2020-4-2 19:25
理论上是这样的课上说过,但是我释放后还是原来的数。没有变,而且每一次运行的结果都不一样,不信你试试 ...

没有释放之前,该空间一直归本程序使用,
释放掉之后,对应的空间可以被其他程序使用,之后再对该空间进行访问,可能就不是原来的值了。

注意我使用的词,是“可能不是原来的值”。也有可能还没有变化

举个例子吧
就像是老师去教室上课,语文老师(相当于你的程序)在了这间教室(访问的空间单元)上课,下课后没有擦黑板就走了。过了一会儿,你再去这间教室看的时候,黑板上可能还是语文老师写的东西,也可能有其他老师(另外的程序)在这间教室上过课,改掉了黑板的内容。
你这刚刚下课,就再去看黑板肯定没有变。但是具体什么时候变,那就看教务处(程序调度管理进程)的安排了,安排了其他课程,那么就变了,一直没安排,可能就会存在的时间比较长。

1024-web1 发表于 2020-4-4 09:14:27

sunrise085 发表于 2020-4-3 12:00
注意我使用的词,是“可能不是原来的值”。也有可能还没有变化

举个例子吧


非常感谢{:5_109:}
页: [1]
查看完整版本: 运行后这段代码,为啥我的vs编译器显示free前后没有变化??