如何正确传递指针参数和return?

How to passing the pointer parameters and return them right?

这是我的代码示例:

#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 space 并将数据分配给 foo 函数中的 ptr1 和 ptr2(因为我不知道它们在 main 函数中的新大小),然后在 main 函数中使用它们。
为什么代码不起作用?以及如何实现我想要的上述流程?

传递指针的地址,修改函数中的指针等等,除此之外我对你的代码有一些观察

  1. 不要强制转换 malloc() 的 return 值,这在 c 中没有必要,而且 hurts 您的代码可读性。

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

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

#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()中的原始指针。

您可以像这样将指针的地址传递给函数:

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 虽然是指针,但仍然通过值传递,因此对它们的任何修改(与修改它们指向的内容相比)都不会保留在函数之后。