我正在尝试使用指针排序数组,也不使用索引变量
void sort(int *a,int n)
{
int *temp;
*temp=0;
int *b=a;
for(;a<a+n-1;a+=1)
{
for(b=a+1;b<b+n;b+=1)
{
if(*a>*b)
{
*temp=*a;
*a=*b;
*b=*temp;
}
}
}
}
不使用指针的上述程序的等效版本是
void sort(int a[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
我正在做一个运动问题,我刚开始自己学习指针。我相信我做得对,因为我试图避免使用索引变量。我收到错误segmentation fault : 11
。我在这里失踪了什么?
这个程序错了吗?或者这个想法本身是错的?反馈意见。
答案 0 :(得分:3)
这两行是错误的:
int *temp;
*temp=0;
在第一行中,您声明一个指针变量。此变量指向某处,但只要您不为此变量指定任何值,就无法知道它指向的位置。
然后,在第二行中,您说:temp
指向的地方,将零写入该存储单元格。所以程序写入一个随机的未知地址。
在您的情况下,temp
根本不应该是指针,因为您以后需要它来存储int
。
作为一般规则,您不应将参数更改为函数,在本例中为a
。而是创建一个局部变量。这样可以防止您比较b<b+n
代码中的其他错误。对于除溢出之外的所有情况,该表达式可以转换为0<n
。表达式应该是p<a+n
,其中p
是您的新本地变量。
答案 1 :(得分:2)
a<a+n-1
- 如果n
&gt;那总是如此1。
BTW,参数int a[]
衰减为指针。
答案 2 :(得分:2)
*temp=0;
不允许:您尚未为temp
使用:
int temp;
或做
int *temp;
temp=malloc(1*sizeof(*temp)); // The dirty way.
答案 3 :(得分:2)
Omnibus版本(UB =未定义的行为=错误和错误):
void sort(int *a,int n)
{
int *temp;
*temp=0; // UB: assignment to uninitialized pointer
int *b=a;
for(;a<a+n-1;a+=1) // UB: a<a+n-1 is always true so this is infinite
{
首先,根据sjsam的回答,我们将int *temp
替换为int temp=0
。
void sort(int *a,int n)
{
int temp=0; // not an index variable, doesn't have to change to pointer
留下无限循环:你需要记住数组在迭代时的结束位置:
int *begin = a;
int *end = a + n; // one-past-the-end for a half-open interval
for (int *i = begin; i < end; ++i) {
请注意,您需要对嵌套循环进行等效更改,*temp
在元素交换中应该只是temp
。