数组元素排序有关问题

数组元素排序问题
本帖最后由 nain001 于 2013-03-03 14:27:34 编辑
题目:编写产生100个1到10范围内的随机数的程序,并且以降序排序。
小白的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
void rank(int*,int);
int main(void){
    int*pti;
    int i;
    int n=100;
    srand((unsigned int)time(0));
    pti = (int *)malloc(100*sizeof(int));
for(i=0;i<n;i++)
pti[i]=rand()%10+1;
rank(pti,n);
getch();
return 0;
}
void rank(int ar[],int n){
    int i,k;
int *temp;
for(i=0;i<n-1;i++)
for(k=i+1;k<n;k++)
if(ar[i]>ar[k]){
    *temp=ar[i];   //为何用Visual studio编译成功但运行提示错误,跳出
ar[i]=ar[k];//Run-Time Check Failure #3 - The variable 'temp' is                                                   
                                              //being used without being initialized.
ar[k]=*temp;
}
for(i=0;i<n;i++){
        if(i%10==0)
printf("\n");
printf("%-4d",ar[i]);
}
}

我用Win-TC可以编译并运行成功,但用Visual studio编译成功但运行失败,跳出Run-Time Check Failure #3 - The variable 'temp' is being used without being initialized.
在Visual studio中把25行

*temp=ar[i];
ar[i]=ar[k];
ar[k]=*temp;

改为

temp=ar[i];
ar[i]=ar[k];
ar[k]=temp;

之后运行成功。但这样改后界面上是提示“不能将int类型的值分配到int* 类型的实体”,但确能运行成功,这是为什么呢?求大虾们帮我解答一下,谢谢了!

------解决方案--------------------
rank函数中,你声明了一个整型指针变量temp,但是没有赋初值,这样你引用一个为初始化的指针变量可能会导致不可预料的后果
------解决方案--------------------
LZ为什么交换元素要用指针?直接int  temp不就行了么
------解决方案--------------------
这是存储空间的问题。
int * temp只是定义了一个指向整形变量的指针,却没有分配存储整形变量的空间。
而且这是一个局部变量,C语言的局部变量是不会自动初始化的,它的值是未定义的。如果是全局变量或者静态变量,那么编译器会自动初始化为0。

语法上是正确的,但运行时的表现是不缺定的。LZ的程序多运行几次,应该能体现出来,有时候能运行有时候程序就会崩溃。

至于不同编译器,有的能编译,有的不能,这只是编译器对代码检查程度不同。