为什么在运行jumbleArrays()之后产生给定的输出?

时间:2019-04-09 03:07:09

标签: 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 <= 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的内容:10 4 42

但实际上是 a1的内容:10 4 42

a2的内容:7 9 11

JumbleArrays正在获取一个指针(除了一个地址),然后对现有数组a1进行了更改。然后,它在堆上创建一个新数组,其基地址将存储在a1中,但是似乎在jumbleArrays()方法返回后,该地址不再存储在a1中了吗?总的来说,当a1和a2显然在jumbleArrays中存储不同的地址时,我不确定a1和a2为何引用它们的旧数组。

1 个答案:

答案 0 :(得分:1)

void jumbleArrays(int *a1, int *a2)
{
    int a1_len = array_len(a1);
    a2 = a1;

请注意,a1a2是指针,并且在最后一行之后,jumbleArrays函数不再知道{{1}中的a2数组的地址}。尽管它的变量名为main,但它现在拥有a2数组的地址。因此,在此行之后,此函数将无法修改原始a1数组。因此,您对更改a2的内容的期望无法成立。它甚至不知道a2在此行之后的位置。

那么我们有:

a2

此后,本地a1 = malloc(sizeof(int) * ARRAY_SIZE); 指针指向一些新分配的内存,并且指向原始a1的原始指针丢失。因此,此行之后的任何内容都无法修改原始a1数组-我们不再知道它在哪里。因此,您对后续行将修改a1中的a1数组的期望是没有道理的。