如何传递指针参数并将它们返回?

时间:2015-03-11 10:37:29

标签: c parameter-passing

这是我的代码示例:

#include <stdio.h>
#include <stdlib.h>
void foo(int size, int new_size, int * ptr1, double * ptr2) {
    int i;
    new_size = size * 2;
    ptr1 = (int *) calloc(new_size, sizeof(int));
    ptr2 = (double *) calloc(new_size, sizeof(double));

    for (i = 0; i < new_size; i++) {
        ptr1[i] = 1;
        ptr2[i] = 2;
    }
}
int main(){
    int i, size = 4, new_size = 4;
    int *ptr1 = NULL;
    double *ptr2 = NULL;

    foo(size, new_size, ptr1, ptr2);

    for (i = 0; i < new_size; i++) {
        printf("new_size: %d\n", new_size);
        printf("ptr1: %d, ptr2: %f\n", ptr1[i], ptr2[i]);
    }

    free(ptr1);
    free(ptr2);

    return 0;
}

我必须使用malloc空间并在foo函数中将数据分配给ptr1和ptr2(因为我不知道它们在主要功能中的新大小)然后在主函数中使用它们。
为什么代码不起作用?以及如何实现我想要的上述流程?

2 个答案:

答案 0 :(得分:3)

您可以将指针的地址传递给函数,如下所示:

void foo(int size, int new_size, int ** ptr1, double ** ptr2) {
    int i;
    new_size = size * 2;
    *ptr1 = (int *) calloc(new_size, sizeof(int));
    *ptr2 = (double *) calloc(new_size, sizeof(double));

    for (i = 0; i < new_size; i++) {
        (*ptr1)[i] = 1;
        (*ptr2)[i] = 2;
    }
}

并在主

foo(size, new_size, &ptr1, &ptr2);

您的代码无效,因为参数是按值传递的。作为指针的ptr1ptr2仍然通过值传递,因此对它们的任何修改(与修改它们指向的内容相比)都不会保留在函数之后。

答案 1 :(得分:2)

传递指针的地址,修改函数中的指针以及所有这些,其他我对你的代码有一些观察

  1. 不要转换malloc()的返回值,在c中不需要,以及hurts代码的可读性。

  2. 始终检查malloc()的返回值以及几乎任何返回值的函数,因为通常会有一个特殊值表示失败,并且您不希望您的程序在特殊情况下行为不端

  3. 这是您自己代码的一个版本,主要问题已解决,以及上述观察结果。

    #include <stdio.h>
    #include <stdlib.h>
    
    int foo(int size, int new_size, int ** ptr1, double ** ptr2) {
        int        i;
        new_size = size * 2;
    
        *ptr1 = malloc(new_size * sizeof(int));
        *ptr2 = NULL;
        if (*ptr1 == NULL)
            return 1;
    
        *ptr2 = malloc(new_size * sizeof(double));
        if (*ptr2 == NULL) {
             free(*ptr1); 
             return 2;
        }
    
        for (i = 0; i < new_size; i++) {
            (*ptr1)[i] = 1;
            (*ptr2)[i] = 2;
        }
    
        return 0;
    }
    
    int main() {
        int i, size = 4, new_size = 4;
        int    *ptr1 = NULL;
        double *ptr2 = NULL;
    
        if (foo(size, new_size, &ptr1, &ptr2) != 0)
            return -1;
        for (i = 0; i < new_size; i++) {
            printf("new_size: %d\n", new_size);
            printf("ptr1: %d, ptr2: %f\n", ptr1[i], ptr2[i]);
        }
    
        free(ptr1);
        free(ptr2);
    
        return 0;
    }
    

    在c中你总是按值传递参数,它可能会让你感到困惑,因为你传递了一个指针,但指针只是另一个存储内存地址的变量,该地址在foo()函数内部发生了变化,但它是只写入本地指针ptr1

    传递地址会将值写入main()中的原始指针。