C指针错误

时间:2015-11-04 14:41:13

标签: c pointers

我刚开始使用Visual Studio IDE在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));
    }
}

但是,我收到了这个错误:

  

在Assignment 1D.exe中0x00007FF698C7190C抛出异常:0xC0000005:
  访问冲突读取位置0x0000000000000000。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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));
    }
}

你应该阅读有关内存分配的内容。

BTW而不是写*(nums + i),你可以写nums[i],它是严格等同的,但更具可读性。

答案 1 :(得分: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)

的内存