无论如何编写代码而不必初始化数组的大小?
#include <stdio.h>
#define MAXSIZE 100
int main()
{
int i,n;
int num[MAXSIZE];
printf("Enter the value of n\n");
scanf("%d",&n);
printf("Enter the list of integers\n");
for(i=0;i<n;i++);
scanf("%d",&num[i]);
for(i=0;i<n;i++)
printf("%d\t",num[i]);
return 0;
}
我使用了MAXSIZE,因为编译器要求我初始化大小,每次我将大小留空时都会出现错误。所有这一切都是因为如果用户想要输入超过100个值,我该如何容纳他?
使用指针是一种更好的编写程序的方法吗? 我试过改变
#include<stdio.h>
int main()
{
int *num,n,i;
printf("Enter the value of n\n");
scanf("%d",&n);
printf("Enter the list of integers\n");
for(i=0;i<n;i++);
scanf("%d",num+i);
for(i=0;i<n;i++)
printf("%d\t",*(num+i));
return 0;
}
这给了我一个警告,说在visual studio中未初始化的局部变量,并没有输入所有数字。输出是垃圾值。 每次执行时,dev c ++都会崩溃。 任何建议都会有所帮助,先谢谢你们。
答案 0 :(得分:1)
当您只使用普通指针时,仍然需要为数组分配内存。我们可以用malloc做到这一点!
int *num,n,i;
printf("Enter the value of n\n");
scanf("%d",&n);
num = malloc(sizeof(*num) * n);
printf("Enter the list of integers\n");
...
此外,即使您使用指针,仍然可以写num[i]
而不是*(num +i)
。实际上,这两个表达式总是可以互换的,因此您应该使用使代码最具可读性的表达式。
答案 1 :(得分:1)
如果您使用的是支持可变长度数组的编译器(C99或更高版本,虽然现在VGA在C2011下是可选的)和,但是数组的大小相对较小,您可以执行以下操作:
int i, n;
...
scanf( "%d", &n );
int num[n];
// load and print num as before
如果您的编译器不支持VLA或数组大小很大(超过几百K),那么您将需要使用malloc
或calloc
动态分配内存:
int i, n;
...
scanf( "%d", &n );
int *num = malloc( n * sizeof *num );
// load and print num as before
答案 2 :(得分:0)
如果您希望用户输入数组大小(在C99 ode中运行程序,可以使用variable length arrays。使用选项:-std=c99
)。
当你需要小内存时使用数组。如果你需要一些大量的内存,那么请使用指针和动态分配。使用指针时,在对其进行访问之前将其初始化为某个内存位置。
答案 3 :(得分:0)
数组是 NOT 指针!
它们的类型类型完全不同,编译器会对它们进行不同的处理。
int *num ;
将num
声明为指向int
的指针,该指针未指向任何有效的内存地址
(编译器报告的“未初始化”)。无论你在第二种情况下做什么操作都会调用未定义的行为
您需要将其指向有效内存位置,在这种情况下使用malloc
调用
num = malloc( sizeof( int ) * n);