c# 函数是否在不向另一个函数传递参数的情况下正常工作?

kyxcudwk  于 2023-05-21  发布在  C#
关注(0)|答案(4)|浏览(210)

这段代码如何正常工作?我使用一个函数插入一个数组,另一个函数在控制台中打印该数组,但我没有将数组传递给打印数组的函数,但它工作正常。这是什么原因呢?

程序

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
n7taea2i

n7taea2i1#

代码不工作,它有未定义的行为。函数getArray将数字读入本地数组,函数DisplayArray打印未初始化的本地数组的内容,索引值从0一直到n,也是未初始化的(!)。它看起来像预期的那样运行,因为两个数组在运行时碰巧被分配在同一个地址,但你不能依赖于此。行为只是未定义。
下面是一个带有定义行为的修改版本:

#include <stdio.h>
#include <stdlib.h>

void getArray(int *array, int n);
void DisplayArray(const int *array, int n);

int main(void) {
    int limit, b[10];

    printf("Enter the limit: ");
    if (scanf("%d", &limit) != 1) {
        fprintf(stderr, "invalid input\n");
        return EXIT_FAILURE;
    }
    if (limit < 1 || limit > 10) {
        fprintf(stderr, "invalid limit: %d\n", limit);
        return EXIT_FAILURE;
    }
    getArray(b, limit);
    DisplayArray(b, limit);
    return EXIT_SUCCESS;
}

void getArray(int *array, int n) {
    printf("Enter the %d values of the array:\n", n);
    for (int i = 0; i < n; i++) {
        if (scanf("%d", &array[i]) != 1) {
            fprintf(stderr, "invalid input\n");
            exit(EXIT_FAILURE);
        }
    }
}

void DisplayArray(const int *array, int n) {
    printf("The values of Array are: ");
    for (int i = 0; i < n; i++) {
        printf(" %d", array[i]);
    }
    printf("\n");
}
gcuhipw9

gcuhipw92#

在这个函数中

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]);
    }
}

变量array被单位化。当你读取一个未初始化的变量时,程序的行为是未定义的。这意味着它可以做任何事情。例如,如果您调用这两个函数之间的另一个函数,输出将发生变化。
始终初始化变量。

doinxwow

doinxwow3#

在这段代码中,getArray()函数用用户输入的值填充一个名为B的数组。但是,DisplayArray()函数没有使用这个数组,而是使用了一个名为array的未初始化数组。
这段代码有效的原因是因为array未初始化,因此被分配到与b相同的内存地址,b是由getArray()函数填充的数组。这是因为当调用DisplayArray()函数时,b数组仍然在作用域中,并且由于C语言中堆栈的工作方式,两个数组被分配到相同的内存空间。
此行为不能保证,并且可能导致意外结果,因此始终将数组传递给使用它的函数非常重要。在这段代码中,你应该修改DisplayArray()函数以接受数组作为参数,如下所示:

void DisplayArray(int array[], int n)
{
    int i;
    printf("The values of Array are: \n");
    for (i = 0; i < n; i++)
    {
        printf("%d\t", array[i]);
    }
}

然后在调用函数时将B数组及其大小传递给函数,如下所示:

getArray();
DisplayArray(b, limit);

希望这有帮助!

r9f1avp5

r9f1avp54#

它不起作用。当你在函数DisplayArray中使用未初始化的数组array时,它被称为未定义行为。
您可以看到这些数字是偶然的,因为分配给array的新堆栈与数组b位于内存中的同一位置。
但这并不意味着你的计划有效。这只是一个巧合。

相关问题