【问题标题】:passing an array of pointers of struct as a ref in C将struct的指针数组作为C中的ref传递
【发布时间】:2010-11-06 04:19:07
【问题描述】:

我想做这样的事情:

struct mystruct {
   char *info;
};

// here is where I'm not sure how to
void do_something(struct mystruct **struc){
    int i;
    for (i = 0; i < 10; i++){
       *struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));
       *struc[i]->info = "foo";
    } 
}
int main(int argc, char *argv[]){
    struct mystruct **struc;

    struc = (struct mystruct **struc) malloc (sizeof(struct mystruct *struc) * 10);

    dosomething(&struc);
    // do something with struc and its new inserted values
    return 0;
}

我不确定如何将其作为参考传递,以便在dosomething() 之后使用它

谢谢

【问题讨论】:

  • 那不应该编译。您将struct mystruct *** 传递给一个接受struct mystruct ** 的函数。除此之外,有什么问题?函数返回后,您应该可以访问所有值。
  • @EboMike:你是对的,不是编译,这是我的问题,我想我对如何正确处理 *、*** 感到困惑。
  • void do_something(struct mystruct **struc) 应该以***struc 作为它的论点,我认为。

标签: c pointers reference struct


【解决方案1】:

好的,这是我的修正版。具体...

第 26 行:没有理由强制转换 malloc(3) 的结果,它已经返回了 void *

第 28 行:不要通过传递 &struc 来创建一个无意义的三间接指针,你已经为它分配了空间,所以很难想象有任何可能的理由来改变它。您最终希望将来自malloc(3) 的确切返回值向下传递到下一层。

第 11 行:另一个不必要的转换,我们确实想更改 struct[i] 处的行指针,即,*struc[i] 将更改 main() 分配的那 10 个指针中的一个指向,但它们没有尚未设置。这就是这里的工作。

通过这些更改,它运行良好...

 1  #include <stdio.h>
 2  #include <stdlib.h>
 3  
 4  struct mystruct {
 5    char *info;
 6  };
 7  
 8  void do_something(struct mystruct ** struc) {
 9    int i;
10    for (i = 0; i < 10; i++) {
11      struc[i] = malloc(sizeof(struct mystruct));
12      struc[i]->info = "foo";
13    }
14  }
15  
16  void do_something_else(struct mystruct ** s) {
17    int i;
18  
19    for (i = 0; i < 10; ++i)
20      printf("%2d: %s\n", i, s[i]->info);
21  }
22  
23  int main(int argc, char *argv[]) {
24    struct mystruct **struc;
25  
26    struc = malloc(sizeof(struct mystruct *) * 10);
27  
28    do_something(struc);
29    do_something_else(struc);
30    return 0;
31  }

【讨论】:

    【解决方案2】:

    使用dosomething(struc); 代替dosomething(&amp;struc);。你有一个struct mystruct **,这就是函数所期望的。

    而不是

    *struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

    使用

    struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

    strucstruct mystruct **,因此 struc[i] 将期望 struct mystruct *

    【讨论】:

      【解决方案3】:

      考虑不强制转换 malloc,因为它是 void *:

      http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1047673478&id=1043284351
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多