不允许使用可变长度数组。但是后来,我最近了解到,用户定义的函数可以操纵原始数组,而不是它自己的个人副本。因此,我想到了创建一个函数来获取用户期望的数组大小,并因此修改大小(我也在此函数中初始化了数组)。
void fill_array(int array[], int size, int in_val);
void main(){
int n, value, list[1], ctr;
clrscr();
printf("Enter the size of the array: ");
scanf("%d", &n);
printf("Enter the value that you want all of the elements to take initially: ");
scanf("%d", &value);
printf("\nAfter scanning value, n = %d\n", n);
fill_array(list, n, value);
printf("\nAfter Function fill_array Execution");
printf("\nThe values of each element of the array is now: %d ", list[0]);
printf("%d ", list [1]);
printf("%d ", list [2]);
printf("\nn = %d\n", n);
printf("value = %d\n", value);
getch();
}
void fill_array(int array[], int size, int in_val){
int ctr;
for (ctr = 0; ctr < size; ++ctr)
array[ctr] = in_val;
printf("\nInside Function");
printf("\nn = %d\n", size);
printf("value = %d\n", in_val);
}
这是控制台/示例运行:
Enter the size of the array: 3
Enter the value that you want all of the elements to take initially: 444
After scanning value, n = 3
Inside Function
n = 3
value = 444
函数fill_array
执行后
数组的每个元素的值现在是:444 444 444
n = 444
值= 444
该函数确实修改了list
。但是,如您所见,它还更改了n
的值。在每次执行fill_array
之后,n
始终等于value
。有人可以向我解释为什么该函数更改n
的值。我不想更改n
的值。
答案 0 :(得分:1)
在fill_array
函数中,您尝试写入list
数组超出范围的内存。这样做将导致不确定的行为。
摘自undefined behaviour上的Wiki文章:
某些编程语言(最著名的是C和C ++)的行为在某些情况下是不确定的。在这些语言的标准中,某些操作的语义被描述为未定义。这些情况通常代表代码中明确的错误,例如,例如在数组边界之外索引数组。
C委员会草案(N1570)对此声明为“未定义行为”:
3.4.3
1种不确定的行为
使用不可移植或错误的程序结构或错误的数据时的行为, 本国际标准对此没有任何要求的
2注意可能的未定义行为,范围从完全忽略具有无法预测结果的情况,到在翻译或程序执行过程中以环境特征记录的方式运行(有无诊断消息),到终止翻译或执行(伴随诊断消息的发布)。
答案 1 :(得分:1)
一旦定义了数组,就无法更改其大小。
一种解决方法是使用动态内存分配,然后像分配数组一样使用分配的内存。看起来可能像这样:
printf("Enter the size of the array: ");
if (scanf("%d", &n) != 1) exit(1);
printf("Enter the value that you want all of the elements to take initially: ");
if (scanf("%d", &value) != 1) exit(1);
int * list = malloc(n * sizeof *list); // allocate memory
fill_array(list, n, value);
// and just use it as an array
list[1] = list[0] + 42; // assuming n >= 2
...
...
free(list);
如果以后需要调整数组大小,则可以使用函数realloc
答案 2 :(得分:0)
由于要求“不允许使用可变长度数组”,因此唯一可行的解决方案是分配“足够大”大小的数组。
然后,您传递的数组大小不是n
,而是元素的数目。
因此,您只需遍历数组并停在长n
处。您需要重写函数fill_array
才能完成此操作。
为什么得到输出是因为undefined behaviour
。有关更多信息,请参见P.W的答案。