更改数组而不返回它[C]

时间:2016-10-07 15:43:15

标签: c arrays function

我只是有一个关于函数中数组的基本问题。 我试图在函数中更改数组而不返回它。 我知道如何为整数或双精度执行此操作,但我不知道如何为数组执行此操作。所以我尝试了一下,现在我很困惑。

我有两个代码,我认为应该做同样的事情,但他们没有。我将数组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;
}

有人可以向我解释为什么只有第二个有效吗?

最诚挚的问候, 罗布

2 个答案:

答案 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]

读者对它的意义更清楚。