我刚开始使用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。
感谢任何帮助。
答案 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)