C 为什么在运行jumbleArrays()后会生成给定的输出?

C 为什么在运行jumbleArrays()后会生成给定的输出?,c,pointers,C,Pointers,我有以下C代码: int array_len(int *a) { int i; for(i = 0; i < ARRAY_SIZE && a[i] != TERMINATOR; i++); return i; } void jumbleArrays(int *a1, int *a2) { int a1_len = array_len(a1); a2 = a1; a2[a1_len] = 42; if(a1_len &

我有以下C代码:

int array_len(int *a) {
    int i;
    for(i = 0; i < ARRAY_SIZE && a[i] != TERMINATOR; i++);
    return i;
}

void jumbleArrays(int *a1, int *a2)
{
    int a1_len = array_len(a1);
    a2 = a1;
    a2[a1_len] = 42;
    if(a1_len <= ARRAY_SIZE)
        a2[a1_len+1] = TERMINATOR;

    a1 = malloc(sizeof(int) * ARRAY_SIZE);
    a1[0] = 41;
    a1[1] = TERMINATOR;
}

int main() 
{
    int a1[ARRAY_SIZE];
    int a2[ARRAY_SIZE];

    a1[0] = 10;
    a1[1] = 4;
    a1[2] = TERMINATOR;

    a2[0] = 7;
    a2[1] = 9;
    a2[2] = 11;
    a2[3] = TERMINATOR;

    jumbleArrays(a1, a2);

    printf("Contents of a1: ");
    for(int i = 0; i < ARRAY_SIZE && a1[i] != TERMINATOR; i++) {
        printf("%d ", a1[i]);
    }
    printf("\n");

    printf("Contents of a2: ");
    for(int i = 0; i < ARRAY_SIZE && a2[i] != TERMINATOR; i++) {
        printf("%d ", a2[i]);
    }
    printf("\n");

    return 0;
}
为什么当程序运行时,为什么输出不是如下所示

a1:41的目录

a2的内容:104 42

但事实并非如此 a1:10 4 42的目录

a2的内容:7 9 11

JumbleArrays只接受一个地址指针,然后对现有数组a1进行更改。然后,它在堆上创建一个新数组,其基址将存储在a1中,但在jumbleArrays方法返回后,该地址似乎不再存储在a1中?总的来说,我不清楚为什么a1和a2在使用JumblearRay存储不同地址时会引用它们的旧数组

void jumbleArrays(int *a1, int *a2)
{
    int a1_len = array_len(a1);
    a2 = a1;
请注意,a1和a2是指针,在最后一行之后,jumbleArrays函数不再知道main中a2数组的地址。它的变量(虽然称为a2)现在保存a1数组的地址。因此,在这一行之后,这个函数所做的任何事情都不可能修改原始的a2数组。因此,你的期望,即它将改变a2的内容是不合理的。它甚至不知道a2在这条线后面的什么地方

然后我们有:

a1 = malloc(sizeof(int) * ARRAY_SIZE);

在此点之后,本地a1指针指向一些新分配的内存,而指向原始a1的原始指针丢失。因此,此行之后的任何内容都不可能修改原始a1数组-我们不再知道它在哪里。因此,您期望后续行将修改main中的a1数组是不合理的。

我不是说它将修改main中原来的2个数组。我不明白的是,不是jumbleArrays方法改变了每个指针存储的内容,也就是每个指针引用的数组。我们更改了a1和a2存储的值,那么为什么当我们打印它们的内容时,这些更改没有反映在main中?@aDabOfRanch main有一个名为a1的变量,而jumbleArrays有一个名为a1的变量,这一事实并没有以任何神奇的方式连接这两个变量。一个是数组,另一个是指针。指针可以指向jumbleArrays想要指向的任何对象,这对它曾经指向的数组没有影响。