我只是有一个关于函数中数组的基本问题。 我试图在函数中更改数组而不返回它。 我知道如何为整数或双精度执行此操作,但我不知道如何为数组执行此操作。所以我尝试了一下,现在我很困惑。
我有两个代码,我认为应该做同样的事情,但他们没有。我将数组b传递给函数Test。在函数中,我尝试用值0,1,2
填充数组#include <stdlib.h>
#include <stdio.h>
void Test(int * vector){
vector = malloc(3*sizeof(int));
int i;
for(i=0;i<3;i++){
*(vector+i)=i;
}
}
int main(){
int b[3];
Test(b);
printf("%i\n",b[0]);
printf("%i\n",b[1]);
printf("%i\n",b[2]);
return EXIT_SUCCESS;
}
此版本不起作用,我没有得到预期的结果0,1,2 另一方面,本守则确实有效:
#include <stdlib.h>
#include <stdio.h>
void Test(int * vector){
int * b = malloc(3*sizeof(int));
int i;
for(i=0;i<3;i++){
*(b+i)=i;
*(vector+i) = *(b+i);
}
}
int main(){
int b[3];
Test(b);
printf("%i, ",b[0]);
printf("%i, ",b[1]);
printf("%i ",b[2]);
return EXIT_SUCCESS;
}
有人可以向我解释为什么只有第二个有效吗?
最诚挚的问候, 罗布
答案 0 :(得分:2)
test
无需致电malloc()
。当您使用数组作为函数参数时,它会传递指向数组的指针。所以你可以简单地写入vector[i]
,它将修改调用者的数组。
void Test(int * vector){
int i;
for(i=0;i<3;i++){
*(vector+i)=i;
}
}
答案 1 :(得分:1)
将数组传递给函数时,它会衰减为指向第一个元素的指针。这就是功能所看到的。但是你接受函数参数vector
并用动态分配的内存覆盖它。然后你无法访问传入的数组。此外,你有一个内存泄漏,因为你没有释放分配的内存。
如果是第二个函数,则不会修改vector
,因此当您取消引用指针时,您正在更改main中的b
。
此外,而不是:
*(vector+i)
使用此:
vector[i]
读者对它的意义更清楚。