我想将指针指向另一个对象并释放先前对象的内存。这是我所做的,但是我有一个无效的指针错误。正确的方法是什么?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int number = 5;
int number2 = 10;
// Give memory manually
int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;
printf("Number is %i\n", number);
printf("Address of number is %p\n", pointer2number);
// Free memory
free(pointer2number);
pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number2;
printf("New number is %i\n", *pointer2number);
return 0;
}
答案 0 :(得分:0)
int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;
您将number
的地址分配给指针pointer2number
,并用其替换之前存储在pointer2number
中的已分配动态内存的地址。
使用number2
的第二次尝试也是如此。
任何尝试free()
先前未由内存管理功能分配的内存都会导致未定义的行为:
“ free函数使ptr指向的空间被释放,即可以进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数执行与内存管理函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。”
来源:ISO / IEC 9899:2018(C18),第7.22.3.3/2节
还有一个副作用,就是先前分配的动态内存也没有free()
。
过度考虑程序的逻辑!