尝试访问C中释放的内存时没有警告

尝试访问C中释放的内存时没有警告,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我试图理解如何在C中管理内存。在下面的示例代码中,在注释中,我添加了我对如何管理内存的理解 我想知道我是否正确 在代码的最后一部分,我试图访问已经释放的内存的一部分。我很惊讶为什么编译器没有通过任何警告 C语言中的编译器不进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对于数组的边界检查也是如此 您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以访问它,而不会出现seg错误。C中的编译器不会进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对

我试图理解如何在C中管理内存。在下面的示例代码中,在注释中,我添加了我对如何管理内存的理解

  • 我想知道我是否正确
  • 在代码的最后一部分,我试图访问已经释放的内存的一部分。我很惊讶为什么编译器没有通过任何警告

  • C语言中的编译器不进行这种检查。如果你有足够的绳子吊死自己

    由你来做检查。对于数组的边界检查也是如此


    您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以访问它,而不会出现seg错误。

    C中的编译器不会进行这种检查。如果你有足够的绳子吊死自己

    由你来做检查。对于数组的边界检查也是如此


    您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以在没有seg故障的情况下访问它。

    分配给
    节点的空间被释放,但
    节点仍然指向相同的位置。因此,它仍然是可访问的。但是如果您运气不好(即操作系统将内存重新用于自己的目的),您将遇到分段错误。

    分配给
    节点的空间被释放,但
    节点仍然指向相同的位置。因此,它仍然是可访问的。但是如果您运气不好(即操作系统将内存重新用于自己的目的),您将遇到分段错误。

    编译器不会检查非法内存访问,您的程序将导致未定义的行为,甚至可能崩溃(分段错误)。这种行为是不可预测的,下次运行程序时,它可能会崩溃

    关于代码的几点:

    main
    的签名应为
    int main(void)

    int main(int argc,char*argv[])

    对这一说法的评论是错误的

    node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
    
    分配内存时,您创建了指针
    pkeys
    ,并使
    节点指向它。此语句为2个
    int
    s数组动态分配内存,并使
    pkeys
    指向它。因此,在执行
    节点->pkeys=temp
    操作时,会丢失动态分配数组的句柄,并会导致内存泄漏。因此,在重新分配
    pkeys
    之前,必须
    释放它指向的内存

    free(node->pkeys);
    
    // now reassign node->pkeys
    

    编译器不会检查非法内存访问,您的程序将导致未定义的行为,甚至可能崩溃(分段错误)。这种行为是不可预测的,下次运行程序时,它可能会崩溃

    关于代码的几点:

    main
    的签名应为
    int main(void)

    int main(int argc,char*argv[])

    对这一说法的评论是错误的

    node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
    
    分配内存时,您创建了指针
    pkeys
    ,并使
    节点指向它。此语句为2个
    int
    s数组动态分配内存,并使
    pkeys
    指向它。因此,在执行
    节点->pkeys=temp
    操作时,会丢失动态分配数组的句柄,并会导致内存泄漏。因此,在重新分配
    pkeys
    之前,必须
    释放它指向的内存

    free(node->pkeys);
    
    // now reassign node->pkeys
    


    编译器不会检查这样的错误。就此而言,如果您忘记了一个“;”,为什么它不能只放一个;这里不是给您一个错误:编译器没有检查pMemory访问。因此,编译时不会看到错误。这段代码在你运行时会失败。C:汇编语言的所有功能和所有安全的。。。汇编语言。@arunmoezhi,因为释放已释放的内存是一个错误。写入释放的内存是未定义的行为。编译器不会检查此类错误。就此而言,如果您忘记了一个“;”,为什么它不能只放一个“;”;这里不是给您一个错误:编译器没有检查pMemory访问。因此,编译时不会看到错误。这段代码在你运行时会失败。C:汇编语言的所有功能和所有安全的。。。汇编语言。@arunmoezhi,因为释放已释放的内存是一个错误。写入释放的内存是未定义的行为。您是对的
    node->pkeys=temp
    将丢失2个整数数组的句柄。我是故意那样做的。我应该修改那一行中的注释,因为
    //在heap中创建了一个数组,并使pkey(也存在于heap中)指向它
    等一会儿。为什么我必须显式地执行
    free(node->pkeys)
    ?当我执行
    free(node)
    操作时,它不会释放节点内完成的所有malloc吗?@arunmoezhi否,因为首先为
    node
    分配内存,然后通过单独的
    malloc
    调用为
    node->pkeys
    分配内存。通过单独的
    malloc
    调用分配的内存需要单独的
    free
    d。您是对的
    node->pkeys=temp
    将丢失2个整数数组的句柄。我是故意那样做的。我应该修改那一行中的注释,因为
    //在heap中创建了一个数组,并使pkey(也存在于heap中)指向它
    等一会儿。为什么我必须显式地执行
    free(node->pkeys)
    ?当我执行
    free(node)
    操作时,它不会释放节点内完成的所有malloc吗?@arunmoezhi否,因为首先为
    node
    分配内存,然后通过单独的
    malloc
    调用为
    node->pkeys
    分配内存。通过单独的
    malloc
    调用分配的内存需要单独的
    free
    d;你至少知道你做错了什么。如果您没有seg故障,但确实损坏了一些合法用于其他目的的数据,那么您就是不幸运的