使用单指针而不是双指针

时间:2019-12-14 13:09:19

标签: c double-pointer

在下面的C代码中,我想使用指向simple_struct的单个指针访问main函数中的foo_array。可能吗?我之所以这样问是因为出于某种原因,框架不允许我将双指针作为函数参数传递。

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

typedef struct
{
    int a;
    float b;
} simple_struct;

void get_foo_value(simple_struct **foo_p)
{
    simple_struct foo_array[2] = {{1,2.1},
                                  {3,4.1}};

    *foo_p = foo_array;
}

int main()
{
    simple_struct *foo_p = 0;
    get_foo_value(&foo_p);
}

2 个答案:

答案 0 :(得分:0)

通过使用get_foo_value函数返回指针,可以避免使用“双指针”参数(至少在您的情况下如此)!

同样,正如您所写的,您的foo_array对函数来说是 local ,并且在返回后将无效。您可以通过以下两种方式之一解决此问题:

  1. 要么将其设为static变量(但随后所有调用将返回指向 same 数据的指针)。
  2. 或使用malloc创建一个新数组(记住稍后要用free释放该内存)。

以下是使用第一个建议的版本:

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

typedef struct
{
    int a;
    float b;
} simple_struct;

simple_struct* get_foo_value(void)
{
    static simple_struct foo_array[2] = {{1,2.1}, {3,4.1}};

    return foo_array;
}

int main()
{
    simple_struct *foo_p = get_foo_value();
}

这是使用malloc方法的可能解决方案:

simple_struct* get_foo_value(void)
{
    simple_struct foo_array[2] = {{1,2.1}, {3,4.1}};
    simple_struct* answer = malloc(sizeof(foo_array));
    memcpy(answer, foo_array, sizeof(foo_array));
    return answer;
}

随时要求进一步的澄清和/或解释。

答案 1 :(得分:0)

通常,当我们想返回一个值时,我们使用return

simple_struct *get_foo_value(void) {
    simple_struct *foo = malloc(...);
    // Initialize *foo...
    return foo;
}

{
    simple_struct *foo = get_foo_value();
}

但是可能将返回值用于其他用途。在这种情况下,我们可以使用参数。参数变量是函数的局部变量,因此对其值的更改不会对调用方产生影响。因此,当我们希望函数在调用方中更改变量时,我们将指针传递给该变量。这意味着,如果我们要使用参数返回指针,则必须使用指向指针的指针。

void get_foo_value(simple_struct **foo_ptr) {
    *foo_ptr = malloc(...);
    // Initialize **foo_ptr...
}

{
    simple_struct *foo;
    get_foo_value(&foo);
}

但是您想要替代方案。

您可以将指针包装在结构中。

typedef struct {
   simple_struct *ptr;
} simple_struct_ptr;

void get_foo_value(simple_struct_ptr *rv) {
    simple_struct *foo = malloc(...);
    // Initialize *foo...
    rv->ptr = foo;
}

{
    simple_struct_ptr foo_ptr;
    get_foo_value(&foo_ptr);
    simple_struct *foo = foo_ptr.ptr;
}

您可以将指针包装在typedef中。

typedef simple_struct *simple_struct_ptr;

void get_foo_value(simple_struct_ptr *rv) {
    simple_struct *foo = malloc(...);
    // Initialize *foo...
    *rv = foo;
}

{
    simple_struct *foo;
    get_foo_value(&foo);
}

这两种解决方案均被视为不良做法。隐藏指针是指针这一事实会妨碍可读性。