首页 > 解决方案 > 在 C 或 C++ 上交换指针

问题描述

为什么第一个选项不起作用?“pointer->malloc”和“type []”之间有区别吗?动态保留内存的一部分?

int a[10];
int b[10];
int *aux;
aux=a;
a=b;
b=aux;
int *a=(int*)malloc(10);
int *b=(int*)malloc(10);
int *aux;
aux=a;
a=b;
b=aux;

标签: c++cpointersswap

解决方案


在这段代码中:

int a[10];
int b[10];
int *aux;
aux=a;
a=b;
b=aux;

该语句aux=a;有效,因为a 衰减为指向其第一个元素的指针。所以这实际上与aux=&a[0];

该语句a=b;不起作用,因为aandb都是数组,并且数组根本不能以这种方式复制。您正在尝试这样做&a[0]=&b[0];,但这根本行不通。您不能在内存中重新分配变量的地址。

如果您std::array改为使用,那么该语句a=b;将起作用,就像std::arrayoperator=实现的那样,它只是将每个元素从一个数组复制到另一个数组。但是,如果您不使用std::array,则必须手动复制元素,使用memcpy()或更好std::copy()

该语句b=aux;不起作用,因为b它是一个数组并且aux是一个指针,并且您不能将指针分配给数组。

对于您尝试做的事情,您将不得不更改aux为一个数组,并将元素从一个数组复制到另一个数组,例如:

#include <algorithm>

int a[10];
int b[10];
int aux[10];
std::copy(a, a+10, aux);
std::copy(b, b+10, a);
std::copy(aux, aux+10, b);

或者,使用std::array,它可以为你做副本:

#include <array>

std::array<int, 10> a;
std::array<int, 10> b;
std::array<int, 10> aux;
aux = a;
a = b;
b = aux;

而在其他代码中:

int *a=(int*)malloc(10);
int *b=(int*)malloc(10);
int *aux;
aux=a;
a=b;
b=aux;

您只是在交换相同类型的指针 ( int*),它们实际指向什么并不重要,您没有触及该数据。顺便说一句,(int*)malloc(10)对于数组来说是错误的int,它需要(int*)malloc(sizeof(int)*10)代替。


推荐阅读