skm*_*ey1 15 c free pointers dynamic-memory-allocation
这合法吗?ptr
它可以在被释放后分配给它吗?
int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
首先,正如我在评论中提到的,请参阅此讨论,了解为什么不在C中强制转换malloc()和family的返回值.
那说,是的,(重新)分配在这里很好.
实际上,问题的措辞
ptr
它可以在被释放后分配给它吗?
应该读
你可以指定
ptr
有一些已经被释放之后?
猜猜看,没有free
-ing 的赋值也是合法的,但是它会产生内存泄漏作为副作用,因为变量ptr
保存了内存分配器函数的返回值,你需要释放内存一旦你是完成后使用它.如果你不保持指针的拷贝重新分配的指针,你将失去获得通过分配函数分配的内存,将有没有办法free()
了.
如果指针持有静态分配变量的地址,则不会(nned)释放它并直接重新分配完全没问题.想想下面这个片段.
int x = 5, y = 10;
int * p = &x;
//do something with p
p = &y; //this is fine, just a re-assignment.
Run Code Online (Sandbox Code Playgroud)
是.它在C语言中是有效的.
有关更多信息的相关堆栈溢出问题:在C中重用已释放的指针
在这种情况下,有问题的内存在释放后的某个时刻有效地分配给另一个指针.再次使用指向释放内存的原始指针,并指向新分配中的某个位置.随着数据的改变,它会破坏有效使用的内存; 这会导致过程中出现未定义的行为.
这合法吗?
ptr
它可以在被释放后分配给它吗?
是的,这是合法的.ptr
可以根据需要重新分配多次.例如,释放指针对于重新分配它不是必需的
int * ptr = malloc(sizeof(int));
int *temp_ptr = ptr; // temp_ptr is pointing to the location ptr is pointing
ptr = malloc(sizeof(int)); // ptr points to new location.
Run Code Online (Sandbox Code Playgroud)
请注意,您不应该转换返回值malloc
.
ptr
它可以在被释放后分配给它吗?Run Code Online (Sandbox Code Playgroud)int * ptr = (int*) malloc(sizeof(int)); /* line 1 */ free(ptr); /* line 2 */ ptr = (int *) malloc(sizeof(int)); /* line 3 */
将您的问题视为:
" 在从前一个动态分配(第1行)指向的内存被释放(第2行)之后,将新近动态分配的内存的地址分配给指针(第3行)是否合法? "
那么这个答案是肯定的.
运行线3也将是有效的,而不具有运行线2尽管如此,如果不调用free()
(线2),分配给所述值ptr
(线1)被覆盖(第3行),以及与此可能性调用free()
上ptr
的初始值丢失了,这反过来使程序泄漏了最初分配的内存.