【问题标题】:Defining pointers to array of structs定义指向结构数组的指针
【发布时间】:2018-10-20 04:38:38
【问题描述】:

我遇到了这段代码:

typedef struct {
    char *name;
    char *value;
} SPAM;

typedef struct {
    char *name;
    int num_spams;
    SPAM *spams;
} EGG;

SPAM my_spams[2] = {
    { "name1", "value1" },
    { "name2", "value2" },
};

EGG my_eggs[1] = {
    { "first egg", 1, my_spams }
};

EXPORT(int) getSPAMANDEGGS(EGG **eggs)
{
    *eggs = my_eggs;
    return 1;
}

在这个声明中,EGG 结构的定义不应该有 SPAM **spams;作为 spams 成员的定义,因为我们稍后会在其中存储一个 SPAM 数组?

【问题讨论】:

  • 数组衰减为指针。所以SPAM *spams可以指向SPAM数组的第一个元素。
  • 就像你可以写char foo[] = "abc"; char *foo_ptr = foo;
  • { "first egg", 1, my_spams }应该是{ "first egg", 2, my_spams },因为num_spams应该对应my_spams数组中的元素个数,也就是2。

标签: c pointers struct


【解决方案1】:

不,不应该。 SPAM 值的数组通过单个指针表示,因此 SPAM *spams 是正确的。

getSPAMANDEGGS 函数的参数需要两个星号的原因是它设置一个从外部传递给它的指针:

EGG *eggArray; // First asterisk is due to *
int eggArraySize = getSPAMANDEGGS(&eggArray); // Second asterisk is due to &

没有& 运算符getSPAMANDEGGS 将无法为eggArray 指针设置新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2012-12-07
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多