2015-11-04 47 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