【问题标题】:Use single pointer instead of double pointer使用单指针代替双指针
【发布时间】:2019-12-14 13:09:19
【问题描述】:

在下面的 C 代码中,我想使用指向 simple_struct 的单个指针访问主函数中的 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);
}

【问题讨论】:

  • 使用参考。或者如果必须使用指针,请使用对指针的引用
  • @DeepeshChoudhary 语言标记为 C - 没有参考。
  • @Adrian - 恢复 Monica 哎呀抱歉
  • 您已有的代码有问题。 foo_array 具有自动存储功能,这意味着您只能在 get_foo_value 返回之前合法访问它。一旦get_foo_value 返回,您就不能再直接或通过指针引用foo_array。您正在尝试做的是未定义的行为。您需要使用malloc
  • ...或静态存储(通过static关键字)

标签: c double-pointer


【解决方案1】:

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

另外,正如您所写,您的foo_array 是函数的本地,返回后将无效。您可以通过以下两种方式之一解决此问题:

  1. 要么将其设为static 变量(但随后所有调用都将返回指向相同数据的指针)。
  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;
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多