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



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

  1. 想知道我是否正确
  2. 在代码的最后一部分,我正在尝试访问已经释放的内存部分。我很惊讶为什么编译器没有通过任何警告
struct node
{
    int keys[2];
    int *pkeys;
};
int main()
{
    int temp[2] = {10,20}; // creates a temp array in stack
    struct node* node = malloc(sizeof(struct node)); //allocates a block of memory on heap pointed by node
    node->keys[0]=1;node->keys[1]=2;  // assigns values for keys present in heap
    node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
    node->pkeys = temp; // the pointer pkeys in heap points to the temp array in stack
    free(node); // the block of memory on heap pointed by node is freed
    node->keys[0] = 9; //**Why does the compiler ignore that I'm accessing freed memory?**
}

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

您在分配内存时创建了指针pkeysnode指向它。此语句为 2 个 int 的数组动态分配内存,并pkeys指向它。因此,当您执行node->pkeys = temp时,您将失去对动态分配的数组的控制权,并将导致内存泄漏。因此,在重新分配pkeys之前,您必须free它指向的内存。

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

分配给node的空间被释放,但仍node指向同一位置。所以它仍然可以访问。但是,如果您不走运(即操作系统将内存重用用于自己的目的),您将获得分段错误。

相关内容

  • 没有找到相关文章