我正在尝试设置指向结构的指针数组。我尝试过两种方法,这两种方法都给了我编译错误。下面是代码示例。
如能提供任何协助,将不胜感激。
在第一个示例中,我得到了一个编译警告
struct stPlanets *pPlanets = &planets;警告是:
警告:从不兼容的指针类型‘struct stPlanets ()5’初始化‘struct stPlanets’-warning兼容-指针类型结构stPlanets *pPlanets =和行星;
示例01。
#include <stdio.h>
int main(void)
{
struct stPlanets {
char *planet;
char *deity[10];
};
struct stPlanets planets[] = {
{"Mercury", {"Messenger"}},
{"Venus", {"Love, Beauty"}},
{"Earth", {"Earthly things"}},
{"Mars", {"War"}},
{"Jupiter", {"Sky, Thunder, King of gods"}}
};
struct stPlanets *pPlanets = &planets;
int i = 0;
int sPlanets = sizeof(planets) / sizeof(struct stPlanets);
printf("There are %d planets.\n", sPlanets);
for (i = 0; i < sPlanets; i++)
{
printf("%-10s : %s.\n", planets[i].planet, planets[i].deity[0]);
}
return 0;
}示例02。
#include <stdio.h>
int main(void)
{
struct stPlanets {
char *planet;
char *deity[10];
};
struct stPlanets *planets[] = {
{"Mercury", {"Messenger"}},
{"Venus", {"Love, Beauty"}},
{"Earth", {"Earthly things"}},
{"Mars", {"War"}},
{"Jupiter", {"Sky, Thunder, King of gods"}}
};
int i = 0;
int sPlanets = sizeof(planets) / sizeof(struct stPlanets);
printf("There are %d planets.\n", sPlanets);
for (i = 0; i < sPlanets; i++)
{
printf("%-10s : %s.\n", planets[i]->planet, planets[i]->deity[0]); //abbreviated to just print first instance.
}
return 0;
}在第二个示例中,我得到以下内容:
planets-06a.c:11:9: warning: braces around scalar initializer
{"Mercury", {"Messenger"}},
^
planets-06a.c:11:9: note: (near initialization for ‘planets[0]’)
planets-06a.c:11:10: warning: initialization of ‘struct stPlanets *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
{"Mercury", {"Messenger"}},
^~~~~~~~~
planets-06a.c:11:10: note: (near initialization for ‘planets[0]’)
planets-06a.c:11:9: warning: braces around scalar initializer
{"Mercury", {"Messenger"}},发布于 2021-01-21 22:34:11
在第一个代码片段中,您必须编写
struct stPlanets *pPlanets = planets;而不是
struct stPlanets *pPlanets = &planets;或者你可以写
struct stPlanets ( *pPlanets )[5] = &planets;也就是说,用作初始化器的数组指示符被隐式转换为指向其第一个元素的指针。
所以在这份声明中
struct stPlanets *pPlanets = planets;声明的对象和初始化器(在隐式转换之后)具有相同的struct stPlanets *类型。
在本声明中
struct stPlanets *pPlanets = &planets;初始化程序的类型为struct stPlanets ( * )[5]。因此,编译器发出消息,声明的对象和初始化程序具有不兼容的类型。
在第二个代码片段中,这个声明
struct stPlanets *planets[] = {
{"Mercury", {"Messenger"}},
{"Venus", {"Love, Beauty"}},
{"Earth", {"Earthly things"}},
{"Mars", {"War"}},
{"Jupiter", {"Sky, Thunder, King of gods"}}
};不正确,因为首先需要定义将由指针数组的元素指向的结构对象。
这是你最新的程序。
#include <stdio.h>
int main(void)
{
struct stPlanets {
char *planet;
char *deity[10];
};
struct stPlanets planets[] = {
{"Mercury", {"Messenger"}},
{"Venus", {"Love, Beauty"}},
{"Earth", {"Earthly things"}},
{"Mars", {"War"}},
{"Jupiter", {"Sky, Thunder, King of gods"}}
};
struct stPlanets *pPlanets = planets;
size_t sPlanets = sizeof(planets) / sizeof( *planets );
printf("There are %zu planets.\n", sPlanets);
for ( size_t i = 0; i < sPlanets; i++ )
{
printf("%-10s : %s.\n", pPlanets[i].planet, pPlanets[i].deity[0]);
}
return 0;
}其输出是
Mercury : Messenger.
Venus : Love, Beauty.
Earth : Earthly things.
Mars : War.
Jupiter : Sky, Thunder, King of gods.https://stackoverflow.com/questions/65836728
复制相似问题