C 使用指针对数组进行排序,不使用任何索引变量
我尝试对数组进行排序,使用指针,也不使用索引变量C 使用指针对数组进行排序,不使用任何索引变量,c,arrays,sorting,pointers,C,Arrays,Sorting,Pointers,我尝试对数组进行排序,使用指针,也不使用索引变量 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=*
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排序(int*a,int-n)
{
内部*温度;
*温度=0;
int*b=a;
对于(;aa
不允许:您尚未为temp
或使用:
int temp;
或者
int *temp;
temp=malloc(1*sizeof(*temp)); // The dirty way.
这两行是错误的:
int *temp;
*temp=0;
在第一行中,您声明了一个指针变量。这个变量指向某个地方,但只要您不给这个变量赋值,您就无法知道它指向哪里
然后,在第二行中,你说:无论temp
指向哪里,都在该内存单元中写入一个零。因此程序写入一个随机未知地址
在您的情况下,temp
不应该是指针,因为您以后需要它来存储int
作为一般规则,您不应更改函数的参数,在本例中为a
。相反,应再创建一个局部变量。这将防止在比较b综合版时代码中出现另一个错误(UB=未定义行为=错误和错误):
这就留下了无限循环:即使在遍历数组时,也需要记住数组的结束位置:
int *begin = a;
int *end = a + n; // one-past-the-end for a half-open interval
for (int *i = begin; i < end; ++i) {
int*begin=a;
int*end=a+n;//在半个开放间隔内,超过端点一次
for(int*i=begin;i
请注意,您需要对嵌套循环进行等效更改,并且在元素交换中,*temp
应该是temp
。好的,我做了一个更改。创建了一个变量,并将指向该变量的指针指定给了temp。仍然收到相同的错误。p,只需使用int temp=0;
-它不是索引变量,so你不需要为了你的练习把它改成指针该死,这是一个更简单的方法。但我仍然收到一个错误?@sjsam我不知道malloc做什么。我刚开始学习指针,这是一个练习question@buggenerator:仅分配4字节内存用于存储和整数值。但不要在此处使用。它使代码变脏是的。这是真的。但是仍然没有得到你所暗示的?循环条件始终为真的循环是一个无限循环-也就是说,你从数组的末尾走出来,继续走,排序你能到达的所有内存,直到程序崩溃。如果你在旧的(预保护的内存)上尝试这个方法操作系统,您可能必须关闭机器电源才能停止它。我们可能会发疯,使用超过一个字符长的变量名。您知道,如果我们愿意的话。注意:两个版本都只使用指针。您从不使用数组进行任何访问。@Olaf是的。每当您将数组传递给函数时,它实际上会传递指向第一个元素的指针数组的。对吗?回滚。得到答案后,您不能更改问题。只需添加澄清或在问题后添加注释。@buggenerator:不仅如此。int a[10];a[1];
:这里a[1]
已经使用了指针。(我不会进一步说明,只需自己做一些研究)好的,我现在知道了,让我知道我解释的是正确的,在上面的程序中,我正在增加a
的值,并且我正在检查yes-第一轮,a+n
与我的end
相同。但是,第二轮,end
保持不变(在数组的末尾),而a+n
自从我们增加a
以来一直在移动。除非你手动操作,否则一开始不会取一次值-整个表达式(a
每次都会得到评估。是的@Roland Illig。这是一个新手错误,我理解我在这方面做错了什么
int *temp;
*temp=0;
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
{
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) {