2015-11-04 64 views
0

我剛剛開始嘗試使用Visual Studio IDE的C中的指針。指針錯誤與C

我已經寫了這個簡單的程序,試圖從用戶那裏獲得10個數字,通過使用指針和模擬標準的1D數組將它們存儲在內存中。

#include <stdio.h> 

int *nums; 

void main() { 
    printf("Enter 10 numbers"); 
    for (int i = 0;i < 10;i++) { 
     scanf_s("%d", *(nums + i)); 
    } 
    printf("Number are: "); 
    for (int i = 0;i < 10; i++) { 
     printf(" %d,", *(nums + i)); 
    } 
} 

不過,我得到這個錯誤:

Exception thrown at 0x00007FF698C7190C in Assignment 1D.exe: 0xC0000005:
Access violation reading location 0x0000000000000000.

任何幫助表示讚賞。

+2

您尚未爲'nums'分配任何內存。此外,這看起來不像C++。 – TartanLlama

+0

'nums'指針未初始化,它指向一些隨機位置。 –

+2

@MichaelWalz它實際上已初始化爲零,因爲所有全局範圍變量都是按照定義。 –

回答

2

你必須保留你要存儲輸入值的內存。

考慮到這種說法

scanf_s("%d", *(nums + i)); 

也是錯誤的。 scanf的參數必須是一個指針。

該程序可能看起來如下方式

#include <stdio.h> 

#define N 10 

int main(void) 
{ 
    int nums[N]; 

    printf("Enter %d numbers: ", N); 

    for (int i = 0; i < N; i++) 
    { 
     scanf_s("%d", nums + i); 
    } 

    printf("Number are: "); 

    for (int i = 0; i < N; i++) 
    { 
     printf(" %d,", *(nums + i)); 
    } 
} 

另一種方法是動態地分配的陣列。

例如

#include <stdio.h> 
#include <stdlib.h> 

#define N 10 

int main(void) 
{ 
    int *nums = malloc(N * sizeof(int)); 

    printf("Enter %d numbers: ", N); 

    for (int i = 0; i < N; i++) 
    { 
     scanf_s("%d", nums + i); 
    } 

    printf("Number are: "); 

    for (int i = 0; i < N; i++) 
    { 
     printf(" %d,", *(nums + i)); 
    } 

    free(nums); 
} 

至於這個錯誤

Exception thrown at 0x00007FF698C7190C in Assignment 1D.exe: 0xC0000005: 
Access violation reading location 0x0000000000000000 

那麼你沒有分配內存然後將鼠標指針nums,因爲它有靜態存儲時間由零由系統初始化。並且錯誤消息顯示您正嘗試訪問地址爲0的存儲器(0x0000000000000000)

+0

非常豐富!謝謝。 – Logan

+0

@Logan歡迎您。:) –

2

你需要這樣的:

#include <stdio.h> 
#include <stdlib.h> 

int *nums; 

void main() {  
    nums = malloc(10 * sizeof(int)); // <<< allocate memory for 10 ints 

    printf("Enter 10 numbers"); 
    for (int i = 0;i < 10;i++) { 
     scanf_s("%d", (nums + i));  // <<< (nums + i) is already a pointer 
    } 
    printf("Number are: "); 
    for (int i = 0;i < 10; i++) { 
     printf(" %d,", *(nums + i)); 
    } 
} 

你應該閱讀有關內存分配。

順便說一句,而不是寫作*(nums + i)你可以寫nums[i]這是嚴格等價但更具可讀性。

+0

也可以使用'calloc(10,sizeof(int))'作爲一個很好的初始化數組。 – apokryfos