我刚刚开始用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));
    }
}

但是,我得到了这个错误:
在分配1D.exe:0xc000005中的0x00007FF698C7190C处引发异常:
访问冲突读取位置0x0000000000000000。
如有任何帮助,我们将不胜感激。

最佳答案

您必须在存储输入值的地方保留内存。
考虑到这个声明

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

然后,由于没有分配内存,系统将具有静态存储持续时间的指针初始化为零。错误消息显示您正在尝试访问地址0(0x0000000000000000)处的内存

关于c - C的指针错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33524651/

10-11 22:55
查看更多