qua*_*tum 2 c pointers memory-leaks
当我在这个函数上运行valgrind时,它说我肯定丢失了4个字节.我知道这是因为我在x = y中重定向指针x,因此无法访问第一行中分配的初始内存.我该如何解决?这里的正确原则是什么?我只是在学习C,所以我试图掌握所有这些.谢谢!
int main() {
int* x = malloc(sizeof(*x));
int* y = malloc(sizeof(*y));
*x = 2;
*y = 5;
x = y;
*y = 6;
*x = 4;
printf("y = %d\n", *y);
free(x);
free(y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过确保首先将值分配给临时指针变量来利用正确的交换idom,这样就不会丢失最初分配给的指针值y
:
int* tmp = x;
x = y;
y = tmp;
Run Code Online (Sandbox Code Playgroud)
这可以包含在一个void swap(void** a, void** b)
函数中,这样您就不必使用临时变量来丢弃代码.它看起来像:
void swap(void** a, void** b)
{
void* tmp = *a;
*a = *b;
*b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
你会称之为swap(&x, &y);
.
此外,截至目前,没有修复指针交换,代码
free(x);
free(y);
Run Code Online (Sandbox Code Playgroud)
是一个双重释放的示例,因为x
和y
变量包含相同的指针值.双重释放会导致未定义的行为,因此您不希望这样做.使用适当的交换习惯用法可以防止这种情况发生.
归档时间: |
|
查看次数: |
803 次 |
最近记录: |