我有以下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为何引用它们的旧数组。
答案 0 :(得分:1)
void jumbleArrays(int *a1, int *a2)
{
int a1_len = array_len(a1);
a2 = a1;
请注意,a1
和a2
是指针,并且在最后一行之后,jumbleArrays
函数不再知道{{1}中的a2
数组的地址}。尽管它的变量名为main
,但它现在拥有a2
数组的地址。因此,在此行之后,此函数将无法修改原始a1
数组。因此,您对更改a2
的内容的期望无法成立。它甚至不知道a2
在此行之后的位置。
那么我们有:
a2
此后,本地a1 = malloc(sizeof(int) * ARRAY_SIZE);
指针指向一些新分配的内存,并且指向原始a1
的原始指针丢失。因此,此行之后的任何内容都无法修改原始a1
数组-我们不再知道它在哪里。因此,您对后续行将修改a1
中的a1
数组的期望是没有道理的。