我正在尝试理解如何在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?**
}
答案 0 :(得分:4)
C中的编译器不进行这种检查。如果有足够的绳索让自己挂起来。
由你来做检查。对于数组的边界检查也是如此。
此外,您需要注意malloc / free并不总是要求/提供给操作系统。这意味着它可能仍然可以被进程访问而没有seg错误。
答案 1 :(得分:2)
编译器不检查非法内存访问,并且您的程序将导致未定义的行为或甚至可能崩溃(分段错误)。行为是不可预测的,下次运行程序时,它可能会崩溃。
您的代码很少:
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
答案 2 :(得分:0)
分配给node
的空格已释放,但node
仍指向同一位置。所以它仍然可以访问。但是如果你运气不好(那就是操作系统为了自己的目的而重复使用内存),你就会遇到分段错误。