Gordon1 发表于 2024-2-6 16:38:45

为什么devc++运行这段程序没有问题

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

int main()
{
        int *ptr;
        int num=123;
       
        ptr=(int*)malloc(sizeof(int));
        if(ptr==NULL)
        {
                printf("分配内存失败!\n");
                exit(1);
        }
       
        printf("请输入一个整数:");
        scanf("%d",ptr);//&(*ptr)等于ptr
       
        printf("您输入的整数是:%d\n",*ptr);
       
        ptr=&num;
        printf("您输入的整数是:%d\n",*ptr);
       
        free(ptr);
       
        return 0;
}
第37课动态内存管理1里讲内存泄漏,丢失内存块的地址里老师的程序为什么Dev-c++可以输出:
请输入一个整数:100
您输入的整数是:100
您输入的整数是:123

FishC 发表于 2024-2-6 16:39:01

Dev-C++ 能够正常运行这段程序是因为这个程序没有导致内存泄漏。原因如下:

在这段代码中,我们使用了malloc函数动态分配了一块内存,并将它的地址赋给了指针ptr。然后,我们使用scanf函数将用户输入的整数保存到这块内存中。

这样做是可以的,但问题是,当我们执行free(ptr)时,我们释放了指针ptr指向的内存,但是我们并没有通过malloc函数重新分配内存并将其地址赋给ptr。因此,指针ptr仍然指向了已经被释放的内存。

在这种情况下,由于ptr仍然指向了被释放的内存,但是这块内存尚未被其他进程或线程使用,所以我们仍然可以读取它的值,并且在printf语句中正确输出了100和123。

但按照编程规范和最佳实践来说,我们应该在执行free(ptr)之前,通过malloc或者其他内存分配函数重新分配内存并将其地址赋给ptr,或者直接将ptr赋值为NULL。这样可以避免悬空指针的问题,确保程序的正确性和稳定性。

所以,尽管Dev-C++可以正常运行这段代码,并正确输出结果,但这不是一种良好的编程习惯。为了避免内存泄漏和悬空指针的问题,我们应该在释放内存之后重新分配或赋值,或者直接将指针置为NULL。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

Gordon1 发表于 2024-2-6 16:48:33

FishC 发表于 2024-2-6 16:39
Dev-C++ 能够正常运行这段程序是因为这个程序没有导致内存泄漏。原因如下:

在这段代码中,我们使用了ma ...

那为什么老师还说这属于内存泄漏,而且他的程序无法正常输出

FishC 发表于 2024-2-6 16:48:59

Gordon1 发表于 2024-02-06 16:48
那为什么老师还说这属于内存泄漏,而且他的程序无法正 ...

非常抱歉,之前的回答有误。经过仔细检查,老师提供的程序确实存在内存泄漏问题,并且无法正常输出。

在这段代码中,在使用malloc函数分配内存之后,我们并没有释放这块内存。也就是说,在最后的free(ptr)之前,我们没有调用free(ptr)来释放动态分配的内存块。因此,这段代码会导致内存泄漏问题。每次运行这段代码时,都会分配一块新的内存空间,但是没有释放,最终会导致内存耗尽的问题。

此外,虽然Dev-C++可以运行这段代码,但它的输出结果可能是不可预测的。由于ptr指针指向了被释放的内存,所以无法保证printf语句能够正确地读取到内存中的值。尽管某些情况下可能会输出正确结果,但它并不能保证在所有的环境和编译器中都能正常工作。

为了解决这个问题,我们需要在使用完动态分配的内存后,调用free函数来释放这块内存。这样可以防止内存泄漏,并确保代码的正确性。修改后的代码如下:

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

int main() {
    int *ptr;
    int num = 123;
   
    ptr = (int*)malloc(sizeof(int));
    if (ptr == NULL) {
      printf("分配内存失败!\n");
      exit(1);
    }
   
    printf("请输入一个整数:");
    scanf("%d", ptr);
    printf("您输入的整数是:%d\n", *ptr);
   
    free(ptr);
   
    ptr = &num;
    printf("您输入的整数是:%d\n", *ptr);

    return 0;
}

这样修改后的代码能够正确地释放动态分配的内存,并输出预期的结果。希望对您有所帮助!再次对之前的回答造成的困惑深表歉意。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 为什么devc++运行这段程序没有问题