2013-12-17 81 views
-2

在爲mergesort創建程序時,我在使用指針而不是數組時遇到錯誤。下面的代碼正確地運行:在使用指針時遇到錯誤「NTVDM CPU遇到非法指令」

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 [100]通過* A在當主定義成爲以下主要即:

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

然後我沒有得到非法指令錯誤:當我把數組輸入代碼在單獨的函數然後當代碼變得以下我沒有得到上述錯誤即。有人可以幫忙嗎?

+2

在使用16位C編譯器時沒有任何意義。 –

回答

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 

}