请问这个c语言程序错在哪里

#include<stdio.h>
int main()
{
void inv(int *x,int n);
int i,*arr;
printf("The original array:\n");
for(i=0;i<10;i++)
scanf("%d",arr+i);
printf("\n");
inv(arr,10);
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%d",*(arr+i));
printf("\n");
return 0;
}
void inv(int *x,int n)
{int *p,m,temp,*i,*j;
m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{
temp=*i;*i=*j;*j=temp;}
return ;
}

稍稍修改了一下:
#include<stdio.h>

#define ARRAY_SIZE 10
int
main()
{
void inv(int *x, int n);
int i, arr[ARRAY_SIZE]; /* 注意不要用 wild pointer */
printf("The original array(%d elements):\n", ARRAY_SIZE);
for (i = 0; i < ARRAY_SIZE; i++)
scanf("%d", arr + i);
printf("\n");
inv(arr, ARRAY_SIZE);
printf("The array has been inverted:\n");
for (i = 0; i < ARRAY_SIZE; i++)
printf("%d ", *(arr + i));
printf("\n");
return 0;
}

void
inv(int *x, int n)
{
int *p, m, temp, *i, *j;
m = (n - 1) / 2;
i = x;
j = x + n - 1;
p = x + m;
for (; i <= p; i++, j--) {
temp = *i;
*i = *j;
*j = temp;
}
return;
}追问

能告诉下为什么原先的那个会有问题吗?谢谢

追答

这里的问题,从第5到第8行
int i,*arr;
printf("The original array:\n");
for(i=0;i<10;i++)
scanf("%d",arr+i);

arr定义成了指针,但是没有让它指向一段内存,也就是野指针。
这样的指针在使用的时候会有问题,就是如果你向这个指针指向的地址写数据(scanf("%d", arr +i)),就很可能破坏程序正常的栈或者操作系统内核,为了保护操作系统,这个时候操作系统会发送一个出错的信号给这个程序,让这个程序结束掉。

所以,这里,要么用 int arr[ARRAY_SIZE], 在栈上分配一段空间,要么用 int *arr = malloc(sizeof(int) * ARRAY_SIZE),在堆上分配一段空间,才能让程序正常运行。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-25
一个简单的高效的 invert

#include <stdio.h>
#define SIZE 10
void invert(int x[],int n);
void main ()
{
int i,a[SIZE];
for (i=0;i<SIZE;i++)
{
scanf("%d ",a[i]);
printf ("%d\t",a[i]);
}
printf ("\n");
invert(a,SIZE);
for (i=0;i<SIZE;i++)
printf ("%d\t",a[i]);
}
void invert(int x[],int n)
{
int i,t;
for (i=0;i<n/2;i++)
{
t=x[i];
x[i]=x[n-1-i];
x[n-1-i]=t;
}
}
第2个回答  2011-11-24
temp=*i;*i=*j;*j=temp;}
return ;
}
这里的 return 应该可以不要