2015-06-01 60 views
2

我試圖通過常量指針訪問結構元素。程序的工作原理應該如此,但是我得到了'不兼容的指針類型'和'(接近'設置'初始化)'的初始化警告''。我真的不知道如何正確使用它。有人可以幫我解決這個問題嗎?常量結構中的結構元素的常量指針

這裏是我的代碼:

這只是一個較大部分的片段。想法是通過指向const結構的指針來訪問結構變量x,y。希望這是有道理的。

#include <stdio.h> 
 
#define PGM_STR(X) ((const char[]) { X }) 
 

 
struct SettingsStruct 
 
{ 
 
    unsigned int x; 
 
    unsigned int y; 
 

 
}Settings; 
 
    \t 
 
struct constitem 
 
{ 
 
\t const char * const text; 
 
\t const struct constitem *next; 
 
\t 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() 
 
{ 
 
\t Settings.x = 1; 
 
\t Settings.y = 2; 
 

 
    \t printf("%s\n",currMenuPtr->text); 
 
    printf("%d\n",*(currMenuPtr->settings)); 
 

 
    currMenuPtr = currMenuPtr->next; 
 
    \t 
 
    \t printf("%s\n",currMenuPtr->text); 
 
    \t printf("%d\n",*(currMenuPtr->settings)); 
 
}

回答

1

在你的代碼,Settings.xunsigned int,因此&Settings.xunsigned int *。您正嘗試使用它初始化const struct SettingsStruct *類型的值。編譯器是非常正確的抱怨 - 你在做什麼是非常可疑的,我想可能不是你的實際意思。這同樣適用於Settings.y

它看起來像你可以通過將struct constitem的第三個元素的類型更改爲unsigned int *來停止抱怨(關於該問題)。不過,您必須在您的程序的較大規劃中判斷這是否適合您。

在初始值設定項中使用&A時,對於變量B還有一個問題,即A尚未在初始值設定項出現的位置聲明。由於您在A的初始化程序中也參考B,所以無法通過交換聲明順序來解決該問題。如果你真的想要一個循環的指針鏈,那麼指針值不能是const,因爲它們中至少有一個需要在初始化後修改。