gpt4 book ai didi

c - 未使用指针正确交换 2D 矩阵的行 - C

转载 作者:行者123 更新时间:2023-11-30 16:51:43 25 4
gpt4 key购买 nike

这是一个简单的程序。目的是将“q”行与“q+1”行交换。奇怪的是,它一开始并没有按预期工作,并非所有行都被正确交换。然后我将临时变量 (t) 带到 for 之外,并删除了 malloc,因为不需要它。然后就成功了。因为这一切对我来说似乎很奇怪,所以我反转了代码(几个 Ctrl+Z)并再次编译。令我惊讶的是它仍然有效,之前不起作用的相同代码(循环中的“t”和malloc)现在可以工作了。为什么?我的意思是,下面的代码有问题吗?

void swap(int **a)
{
for(int q=0;q<3;q++)
{
int *t=malloc(sizeof(int)*4);
t=a[q];
a[q]=a[q+1];
a[q+1]=t;
free(t);
}
}

int main()
{
int **a=malloc(4*sizeof(int*));
for(int q=0;q<4;q++)
a[q]=malloc(4*sizeof(int));

for(int q=0;q<4;q++)
for(int w=0;w<4;w++)
a[q][w]=q;

swap(a);
for(int q=0;q<4;q++)
{
for(int w=0;w<4;w++)
printf("%d ", a[q][w]);
printf("\n");
}
}

最佳答案

  1. malloc() 的调用是无用的,因为您通过将 a[q] 分配给 t 立即覆盖返回值>。分配的内存丢失。这称为内存泄漏。

  2. 调用free()不会释放t = malloc(...)分配的内存,而是释放分配的内存a[q] = malloc(...)。随着 q 的前进,您正在逐行销毁数组 a

  3. 如果删除分配t = malloc(...)free(t),代码开始接近正确性,但是...

  4. 它的作用是:

    • a[0]a[1] 交换,因此数组 a 现在为 1 0 2 3
    • 然后将 a[1]a[2] 交换,因此数组 a 现在为 1 2 0 3
    • 然后将 a[2]a[3] 交换,因此数组 a 现在为 1 2 3 0

关于c - 未使用指针正确交换 2D 矩阵的行 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41642423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com