为什么我的职能会改变输入论证的价值?

时间:2018-09-21 06:31:52

标签: c function

不允许使用可变长度数组。但是后来,我最近了解到,用户定义的函数可以操纵原始数组,而不是它自己的个人副本。因此,我想到了创建一个函数来获取用户期望的数组大小,并因此修改大小(我也在此函数中初始化了数组)。

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的值。

3 个答案:

答案 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的答案。