我试图了解在 C 语言中如何管理内存。在下面的示例代码中,在注释中,我添加了对如何管理内存的理解。
- 我
- 想知道我是否正确
- 在代码的最后一部分,我正在尝试访问已经释放的内存部分。我很惊讶为什么编译器没有通过任何警告
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
您在分配内存时创建了指针pkeys
并node
指向它。此语句为 2 个 int
的数组动态分配内存,并pkeys
指向它。因此,当您执行node->pkeys = temp
时,您将失去对动态分配的数组的控制权,并将导致内存泄漏。因此,在重新分配pkeys
之前,您必须free
它指向的内存。
free(node->pkeys);
// now reassign node->pkeys
分配给node
的空间被释放,但仍node
指向同一位置。所以它仍然可以访问。但是,如果您不走运(即操作系统将内存重用用于自己的目的),您将获得分段错误。