使用指针时遇到错误“NTVDM CPU遇到了非法指令”

时间:2013-12-17 18:58:25

标签: c++ c

在为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();
}

然后我没有得到非法指令错误。有人可以帮忙吗?

1 个答案:

答案 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

}