这段代码如何正常工作?我使用一个函数插入一个数组,另一个函数在控制台中打印该数组,但我没有将数组传递给打印数组的函数,但它工作正常。这是什么原因呢?
程序
void getArray();
void DisplayArray();
int main(void)
{
getArray();
DisplayArray();
return EXIT_SUCCESS;
}
void getArray()
{
int limit, b[10];
printf("Enter the limit:");
scanf("%d", &limit);
printf("Enter the values of the array:");
for (i = 0; i < limit; i++)
{
scanf("%d", &b[i]);
}
}
void DisplayArray()
{
int i, n, array[10];
printf("The values of Array is: \n");
for (i = 0; i < n; i++)
{
printf("%d\t", array[i]);
}
}
输出
Enter the limit:4
Enter the values of the array2
4
6
8
The values of Array is:
2
6
8
4条答案
按热度按时间n7taea2i1#
代码不工作,它有未定义的行为。函数
getArray
将数字读入本地数组,函数DisplayArray
打印未初始化的本地数组的内容,索引值从0
一直到n
,也是未初始化的(!)。它看起来像预期的那样运行,因为两个数组在运行时碰巧被分配在同一个地址,但你不能依赖于此。行为只是未定义。下面是一个带有定义行为的修改版本:
gcuhipw92#
在这个函数中
变量
array
被单位化。当你读取一个未初始化的变量时,程序的行为是未定义的。这意味着它可以做任何事情。例如,如果您调用这两个函数之间的另一个函数,输出将发生变化。始终初始化变量。
doinxwow3#
在这段代码中,
getArray()
函数用用户输入的值填充一个名为B的数组。但是,DisplayArray()
函数没有使用这个数组,而是使用了一个名为array的未初始化数组。这段代码有效的原因是因为array未初始化,因此被分配到与b相同的内存地址,b是由
getArray()
函数填充的数组。这是因为当调用DisplayArray()
函数时,b数组仍然在作用域中,并且由于C语言中堆栈的工作方式,两个数组被分配到相同的内存空间。此行为不能保证,并且可能导致意外结果,因此始终将数组传递给使用它的函数非常重要。在这段代码中,你应该修改
DisplayArray()
函数以接受数组作为参数,如下所示:然后在调用函数时将B数组及其大小传递给函数,如下所示:
希望这有帮助!
r9f1avp54#
它不起作用。当你在函数
DisplayArray
中使用未初始化的数组array
时,它被称为未定义行为。您可以看到这些数字是偶然的,因为分配给
array
的新堆栈与数组b
位于内存中的同一位置。但这并不意味着你的计划有效。这只是一个巧合。