【问题标题】:How do I return a pointer to an array from my function in C?如何从 C 中的函数返回指向数组的指针?
【发布时间】:2017-03-22 18:49:59
【问题描述】:

抱歉,有很多类似的问题,但我就是不知道我做错了什么(业余警告!)。

我正在尝试在一个函数中填充两个数组,然后将信息返回到 main。我在 main 中声明了数组,但需要在函数中为它们分配内存(计算出它们应该有多大)。虽然数组看起来填充得很好,我可以从函数中打印它们,但当我尝试从 main 打印它们时出现分段错误。

我尝试在这个简化的程序中使用填充一个数组的函数进行故障排除 - 它有同样的问题。我想我在填满我的指针 - 我做错了什么?这是代码和输出:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

void *make_v(double num, double *v)
{
        int i;
        v = (double *)calloc(5,sizeof(double));
        for (i=0; i<5; i++) {
                num += 5;
                v[i] = num;
        }

        printf("IN: ");
        for (i=0; i<5; i++)
                printf("%lf ", v[i]);
        printf("\n");
}

main(int argc,char **argv)
{
        double *v=NULL;
        double num=10.0;
        int i;

        make_v(num, v);

        printf("OUT:\nv:[");
        for (i=0; i<5; ++i) {
                printf("%lf ", v[i]);
        }
}

这输出: 输入:15.000000 20.000000 25.000000 30.000000 35.000000 出去: 分段错误

如果有什么不同的话,我正在 linux 中编码......

希望有人能帮忙,谢谢!

【问题讨论】:

  • 我会更改 make_v 以返回一个双 *,然后在最后返回 v。去掉第二个参数。
  • 如果你传入一个double * 指针,你可以改变它指向的位置,但你不能改变它指向的位置,因为地址是按值传递的。如果您想更新它指向的位置,您需要像这样传递double **:void make_v(double num, double **v){...} int main(){... double *v=NULL; ... make_v(num, &amp;v); ... }
  • 一般不要投射calloc&朋友或void *的结果。并且不要在没有需要的情况下使用void *!
  • 嗨,JerryJeremiah - 很抱歉,我一直在关注你,但是我现在如何分配和填写 v 函数?
  • 嗨 Bruceg - 是的,这会更整洁,但这是一个故障排除功能。我的真实函数有 6 个参数,填充两个数组并返回一个 int ......所以不幸的是,这不是一个选项。

标签: c arrays function pointers


【解决方案1】:
double *make_v(double num)
{
    int i;
    v = (double *)calloc(5,sizeof(double));
    for (i=0; i<5; i++) {
            num += 5;
            v[i] = num;
    }

    printf("IN: ");
    for (i=0; i<5; i++)
            printf("%lf ", v[i]);
    printf("\n");
    retrun v;
}

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2021-06-25
    • 1970-01-01
    • 2011-01-12
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2020-04-29
    相关资源
    最近更新 更多