【问题标题】:Change Array without returning it [C]更改数组而不返回它 [C]
【发布时间】:2023-03-28 06:58:01
【问题描述】:

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

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

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

最好的问候, 抢

【问题讨论】:

  • for (int i=0;i&lt;3;i++) vector[i]=i; 是正确的代码。您已经为main 中的堆栈上的数组分配了内存。所以你需要做的就是填写值。
  • vector = malloc(3*sizeof(int)); 用指向新的、不相关的内存块的指针覆盖 vector 参数。如果要填充原始vector 指向的内存,请不要丢弃该指针。 =)

标签: c arrays function


【解决方案1】:

当您将数组传递给函数时,它会衰减为指向第一个元素的指针。这就是函数所看到的。但是随后您使用函数参数vector 并用动态分配的内存覆盖它。那么您将无法访问您传入的数组。此外,您还存在内存泄漏,因为您没有释放分配的内存。

在第二个函数的情况下,您不修改 vector,因此当您取消引用指针时,您正在更改 main 中的 b

另外,不要这样:

*(vector+i)

使用这个:

vector[i]

这对读者来说意味着什么更清楚了。

【讨论】:

【解决方案2】:

test 不需要调用malloc()。当您使用数组作为函数参数时,它会传递一个指向该数组的指针。所以你可以简单地写入vector[i],它会修改调用者的数组。

void Test(int * vector){
    int i;
    for(i=0;i<3;i++){
        *(vector+i)=i;
    }
}

【讨论】:

  • 非常感谢。我做的比我想象的要复杂得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多