我试图通过常量指针访问结构元素。程序就像应该的那样工作,但是我从不兼容的指针类型中得到了警告和初始化#39;和'(接近初始化' B.settings)'。我真的不知道如何正确地进行初始化。有人可以帮我解决这个问题吗?
这是我的代码:
它只是一个较大部分的片段。想法是通过指向const结构的指针访问结构变量x,y。希望有意义。
#include <stdio.h>
#define PGM_STR(X) ((const char[]) { X })
struct SettingsStruct
{
unsigned int x;
unsigned int y;
}Settings;
struct constitem
{
const char * const text;
const struct constitem *next;
const struct SettingsStruct * settings;
};
struct constitem const A;
struct constitem const B = {PGM_STR("x"), &A, &Settings.x };
struct constitem const A = {PGM_STR("y"), &B, &Settings.y };
static const struct constitem *currMenuPtr=&A;
void main()
{
Settings.x = 1;
Settings.y = 2;
printf("%s\n",currMenuPtr->text);
printf("%d\n",*(currMenuPtr->settings));
currMenuPtr = currMenuPtr->next;
printf("%s\n",currMenuPtr->text);
printf("%d\n",*(currMenuPtr->settings));
}
&#13;
答案 0 :(得分:1)
在您的代码中,Settings.x
是unsigned int
,因此&Settings.x
是unsigned int *
。您正尝试使用它来初始化const struct SettingsStruct *
类型的值。编译器很抱怨 - 你在做什么是非常值得怀疑的,我想可能不是你真正想做的事情。这同样适用于Settings.y
。
看起来您可以通过将struct constitem
的第三个元素的类型更改为unsigned int *
来让编译器停止抱怨(关于此)。但是,你必须判断在你的程序的更大方案中这是否真的适合你。
如果在初始化程序出现时尚未声明&A
,则在变量B
的初始化程序中使用A
时也会出现问题。因为你也在B
的初始值设定项中引用A
,你无法通过交换声明顺序来解决这个问题。如果你真的想要一个循环的指针链,那么指针值不能是const
,因为在初始化之后至少需要修改其中一个。