gpt4 book ai didi

arrays - 使用指针交换数组

转载 作者:行者123 更新时间:2023-12-01 22:51:27 26 4
gpt4 key购买 nike

我试图用指针交换两个数组。我想要的是使用引用调用进行交换。

下面是我写的代码

#include <stdio.h>
#include <stdlib.h>

void swap(int **a, int **b) {
int *temp = (int*)malloc(5*sizeof(int));

temp = *a;
*a = *b;
*b = temp;
}

int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {6, 7, 8, 9, 10};

swap((int**)&arr1, (int**)&arr2);

for(int i=0; i<5; i++) printf("%d\t", arr1[i]);
printf("\n");
for(int i=0; i<5; i++) printf("%d\t", arr2[i]);
printf("\n");
}

代码的输出是:

6   7   3   4   5   
1 2 8 9 10

代替:

6   7   8   9   10  
1 2 3 4 5

我做错了什么?

最佳答案

在这次通话中

swap((int**)&arr1, (int**)&arr2);

传递的指针指向数组 arr1arr2 的第一个元素。

所以在函数 swap

void swap(int **a, int **b) {
int *temp = (int*)malloc(5*sizeof(int));

temp = *a;
*a = *b;
*b = temp;
}

取消引用指针,例如

*a

结果读取数组 arr1 的前两个元素作为指针,因为在您的系统中 sizeof( int * ) 等于 2 * sizeof(整数)

也就是说,数组的前两个元素的值被解释为指针的值。

并且获得的输出证实了这一点

6   7   3   4   5   
1 2 8 9 10
^^^^^

此外,该函数存在内存泄漏,因为起初内存是动态分配的,其地址被分配给指针 temp,然后指针被重新分配

    int *temp = (int*)malloc(5*sizeof(int));

temp = *a;

所以分配内存的地址丢失了,内存没有释放。

你不能以这种方式交换数组。您需要交换数组的每对元素。

该函数可以通过以下方式查找示例

void swap( int *a, int *b, size_t n ) 
{
for ( int *p = a; p != a + n; ++p, ++b )
{
int temp = *p;
*p = *b;
*b = temp;
}
}

函数调用方式如下

swap( arr1, arr2, 5 );

不太灵活的函数可以看起来像下面这样

void swap( int ( *a )[5], int ( *b )[5] ) 
{
for ( int *p1 = *a, *p2 = *b; p1 != *a + 5; ++p1, ++p2 )
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}

函数调用方式如下

swap( &arr1, &arr2 );

关于arrays - 使用指针交换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74262861/

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