在为mergesort创建程序时,我在使用指针而不是数组时遇到错误。以下代码正确运行:
void main()
{
clrscr();
int n,i,A[100];
cout<<"Enter the value of n: ";
cin>>n;
cout<<"\nEnter the array: ";
for(i=0;i<n;i++)
cin>>A[i];
mergesort(A,0,n-1);
cout<<"Sorted array is: ";
for(i=0;i<n;i++)
cout<<A[i]<<" ";
getch();
}
但是当我用A替换A [100]时,主要定义如下:
void main()
{
clrscr();
int n,i,*A;
cout<<"Enter the value of n: ";
cin>>n;
cout<<"\nEnter the array: ";
for(i=0;i<n;i++)
cin>>A[i];
mergesort(A,0,n-1);
cout<<"Sorted array is: ";
for(i=0;i<n;i++)
cout<<A[i]<<" ";
getch();
}
然后程序也提供正确的输出,但在退出控制台窗口之前,它会出现错误“ NTVDM CPU遇到非法指令”。当我将数组输入代码放在单独的函数中时,我不会得到上述错误,即当代码变为以下时:
int getList(int* A)
{
int n;
cout<<"\nEnter the value of n: ";
cin>>n;
cout<<"\nEnter the array: ";
for(int i=0;i<n;i++)
cin>>A[i];
return n;
}
void main()
{
clrscr();
int n,*A;
n=getList(A);
mergesort(A,0,n-1);
cout<<"Sorted array is: ";
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
getch();
}
然后我没有得到非法指令错误。有人可以帮忙吗?
答案 0 :(得分:1)
你已经声明了一个指针int *A
,但没有指向它的记忆。
声明后,添加
A = malloc(100 * sizeof(int));
在主要退出之前,添加:
free(A);
当您从静态数组转换为使用动态内存(因此明确使用指针)时,您需要手动分配内存。
另外,在声明它时将指针指定为NULL是一种很好的形式:
int *A = NULL;
这将使调试更容易 - 当您尝试取消引用指针时,您将获得空指针异常,而不是在内存损坏时发生随机错误。
另一方面,malloc可能会失败(它将返回NULL)。因此,你应该在malloc调用之后检查A:
if (NULL == A) {
// do some error handling
}