我想通过用户输入数组长度来改善程序。在C中有可能吗?
这是我的代码:
int main() {
int sum = 0;
int a;
int array[a] = {};
printf("Insert length of array:\n");
scanf("%d", &a);
for (int i = 0; i < a; i++) {
printf("Insert number %d \n", i + 1);
scanf("%d", &array[i]);
}
for (int i = 0; i < a; i++) {
sum = sum + array[i];
}
printf("Sum is %d \n", sum);
return 0;
}
但是,当我尝试编译它时,它显示:error: variable-sized object may not be initialized
任何可能的解决方案?
答案 0 :(得分:0)
是的,在C语言中您无法创建可变大小的数组,而在这种情况下 variable-size 意味着在编译时大小不固定的数组无法创建。但是您可以使用指针,并且在用户输入后可以分配具有适当长度的数组。
例如:
int* array;
int length;
printf("Enter length of the array: ");
scanf("%d", &length);
// maybe you need to add checking, like if length > 0
array = malloc(sizeof(int) * length);
// now you have array with `length` elements and 0..`length`-1 indexes
答案 1 :(得分:0)
程序失败的原因有多种:
定义PATH
使用未初始化的变量int array[a] = {};
,因此程序具有未定义的行为。您必须在读取a
的值之后定义此数组。
可变大小的自动数组不能具有初始化程序。您必须以其他方式初始化数组,或者根本不初始化数组,因为您在以下循环中读取了值。
如果大小a
为负或太大,则本地数组的创建将具有未定义的行为。对于潜在的大型对象,最好使用a
或malloc()
从堆中分配。
您不测试calloc()
的返回值,从而导致无效输入的不确定行为。
这是更正的版本:
scanf()
如果要处理更大的数组,可以使用#include <stdio.h>
int main() {
int sum;
int a;
printf("Insert length of array:\n");
if (scanf("%d", &a) != 1 || a <= 0 || a > 1000) {
fprintf(stderr, "Invalid input\n");
return 1;
}
int array[a];
for (int i = 0; i < a; i++) {
printf("Insert number %d:\n", i + 1);
if (scanf("%d", &array[i]) != 1) {
fprintf(stderr, "Invalid input\n");
return 1;
}
}
sum = 0;
for (int i = 0; i < a; i++) {
sum = sum + array[i];
}
printf("Sum is %d\n", sum);
return 0;
}
分配数组,但也可以即时计算总和,而不是将读取的值存储在数组中:
malloc()