[英]C++ program behavior on pointers to integer array
谁能解释一下为什么循环只执行一次!!
for 循环执行一次,永远不会到达程序的结尾,如果您有时间检查我的错误,请指出错误,因为我知道这不是这样做的!!
using namespace std;
#include<iostream>
int* rotate(int* ar,int d,int n)
{
int tmp[n];
d = d%n;
for (int i = 0; i < n; ++i)
{
tmp[i] = ar[(i+d)%n];
}
free(ar);
return tmp;
}
int main(int argc, char const *argv[])
{
int arr[] = {1,2,3,4,5};
int *a;
int n = sizeof(arr)/sizeof(arr[0]);
a = rotate(arr,4,n);
cout<<endl;
for (int i = 0; i < n; ++i)
{
cout<<i<<endl;
cout<<a[i]<<endl;
}
cout<<"End";
return 0;
}
让我们把它拆开...
int* rotate(int* ar,int d,int n)
{
int tmp[n]; // 1
d = d%n;
for (int i = 0; i < n; ++i)
{
tmp[i] = ar[(i+d)%n];
}
free(ar); // 2
return tmp; // 3
}
int tmp[n];
不是标准的 C++ 。 如果您不想使用std::vector
则正确的替换将是动态分配的数组。
您使用未通过malloc
分配的指针调用free
,这会调用未定义的行为。 在 C++ 中,您根本不应该使用free
和malloc
,而应该使用new
和delete
。 还有new
和delete
仅用于此类练习。 否则使用智能指针。
您返回一个指向局部变量的指针。 指针悬空,在 main 中使用它会调用未定义的行为。
您不能简单地将main
的静态数组arr
替换为函数中的其他内容。 不应期望名为rotate
的函数创建新数组或删除传递的数组(也因为就像您的情况一样,这是不可能的)。
有多种方法可以修复您的代码。 我选择使rotate
“就地”旋转阵列。 但是,正如您所看到的,该实现实际上使用了一个相同大小的附加数组。 我把它留给你来弄清楚如何改变它以使用更少的额外内存:
#include <iostream>
using std::cout;
using std::endl;
void rotate(int* ar,int d,int n)
{
int* tmp = new int[n];
d = d%n;
for (int i = 0; i < n; ++i)
{
tmp[i] = ar[(i+d)%n];
}
for (int i = 0; i < n; ++i)
{
ar[i] = tmp[i];
}
}
int main(int argc, char const *argv[])
{
int arr[] = {1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
rotate(arr,4,n);
cout<<endl;
for (int i = 0; i < n; ++i)
{
cout<<i<<endl;
cout<<arr[i]<<endl;
}
cout<<"End";
return 0;
}
这是使用std::rotate
执行相同操作的方法:
#include <array>
#include <iostream>
#include <algorithm>
int main(int argc, char const *argv[])
{
int arr[] = {1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
std::rotate(std::begin(arr),std::begin(arr)+4,std::end(arr));
for (int i = 0; i < n; ++i)
{
std::cout << i << std::endl;
std::cout << arr[i] << std::endl;
}
std::cout<<"End";
}
...它甚至使用指针;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.