C 为什么在运行jumbleArrays()后会生成给定的输出?
我有以下C代码: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 &
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想要指向的任何对象,这对它曾经指向的数组没有影响。