C 使用单指针而不是双指针

C 使用单指针而不是双指针,c,double-pointer,C,Double Pointer,在下面的C代码中,我想使用指向simple_struct的单指针访问main函数中的foo_数组。可能吗?我这样问是因为出于某种原因,框架不允许我传递双指针作为函数参数 #include <stdio.h> #include <stdlib.h> typedef struct { int a; float b; } simple_struct; void get_foo_value(simple_struct **foo_p) { simple

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

#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);
}
#包括
#包括
类型定义结构
{
INTA;
浮球b;
}结构简单;
void get\u foo\u值(简单结构**foo\u p)
{
简单结构foo_数组[2]={{1,2.1},
{3,4.1}};
*foo_p=foo_数组;
}
int main()
{
简单结构*foo\u p=0;
获取_foo_值(&foo_p);
}
您可以通过让
get\u foo\u value
函数返回指针来避免“双指针”参数(至少在您的情况下是这样)

另外,正如您所写,您的
foo_数组
对于函数来说是本地的,并且在返回后将无效。您可以通过以下两种方式之一解决此问题:

  • 或者将其设置为
    静态
    变量(但是所有调用都将返回指向相同数据的指针)
  • 或者使用
    malloc
    创建一个新数组(记住在以后的某个时候使用
    free
    释放内存)
  • 以下是使用第一个建议的版本:

    #包括
    #包括
    类型定义结构
    {
    INTA;
    浮球b;
    }结构简单;
    简单结构*get\u foo\u值(void)
    {
    静态简单结构foo_数组[2]={{1,2.1},{3,4.1};
    返回foo_数组;
    }
    int main()
    {
    simple_struct*foo_p=get_foo_value();
    }
    
    下面是一个使用
    malloc
    方法的可能解决方案:

    simple_struct*get_foo_值(void)
    {
    简单结构foo_数组[2]={{1,2.1},{3,4.1};
    simple_struct*answer=malloc(sizeof(foo_数组));
    memcpy(应答、foo_数组、sizeof(foo_数组));
    返回答案;
    }
    

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

    通常,当我们想要返回一个值时,我们使用
    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);
    }
    

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

    请改用引用。或者,如果必须使用指针,请使用对pointer@DeepeshChoudhary语言被标记为
    C
    ,它没有引用。@Adrian-恢复Monica oops,很抱歉,您已有的代码有bug
    foo\u数组
    具有自动存储功能,这意味着您只能在
    get\u foo\u value
    返回之前合法地访问它。一旦
    get\u foo\u value
    返回,就不再允许直接或通过指针引用
    foo\u数组。您试图做的是未定义的行为。您需要使用
    malloc
    …或静态存储(通过
    static
    关键字)