2012-04-21 33 views
0

我在這裏有這個代碼,它給了我編譯器錯誤,我知道這裏有幾十個其他問題,基本上完全相同;我閱讀了其中的很多內容,並沒有回答所有的問題。過去幾天我在堆棧和教學網站上閱讀了很多關於指針和結構的知識,還有幾十個,我覺得我只需要在我面前解釋和解釋一個物理示例。我覺得我對這些東西大部分都瞭解,但是我比我更願意對自己更加不確定。如果有人能幫助我理解發生了什麼。我已經在下面發佈了一個編號列表,告訴你我在想什麼,並且希望我對大多數人都適合,而不是爲了解釋你需要做哈哈而開玩笑。那麼這裏是代碼。'unary *'的無效類型參數(有'int')。基本上我遇到了指針和結構的邏輯問題

struct foo{ 
    int num; 
    char *word; 
    struct foo *ptr; 
}; 

void func1(struct foo*); 
void func2(struct foo); 

int main() { 

    struct foo a; 
    a.num = 20; 
    a.word = "wordOne"; 
    func1(&a); 
    printf("%d %s", a.num, a.word);  // refer to #3 below. 

    a.ptr = &a; 
    a.num = 55; 
    a.word = "thirdToLastWord"; 
    func2(a); 
    printf("%d %s\n", a.num, a.word); 
} 

void func1(struct foo *a) 
{ 
    while(*(a->word) != '\0') 
     { 
      putchar(*(a->word)); 
      a->word++; 
     } 
    putchar('\n'); 
    if(a->num % 10 != 0) 
     { a->num *= 2; } 
    a->word--; 
    printf("num equals %d\n", (*a).num); 
} 

void func2(struct foo a) 
{ 
    if((*a).num == a->ptr->num)    //compiler error 
     {(*a).num = (*((*a).ptr)).num +1; } //compiler error 
    else { a->num = 200; } 
    a->word = "wordsix"; 
    a->ptr->word = "wordseven"; 
    printf("function 2 %d %s\n", (*a).num, (*((*a).ptr)).word);} 
} 

好的。所以我想我明白了第一個功能。但是,如果我錯了,請糾正我下面的任何錯誤,或者我對錯誤地理解爲什麼錯在哪裏。

1)在主func1聲明struct「foo」作爲指針之前。當調用func1時,我們傳入「a」的地址,以便知道指向哪個地址。 2)func1中的所有內容都會改變原始結構。這個詞被遞減,只在func1以外打印出來時才顯示最後一個字母「e」。

3)就行了我評論#3所打印出的原始結構Foo的.num沒有指針的版本(即使它們是相同的東西)。

我希望我到目前爲止還沒有搞砸。

4)Ok a.ptr = & a將struct var「struct foo * ptr」設置爲與原始foo結構相等的地址;這恰好是指針「struct foo * ptr」發現自己的確切結構。對吧?

5)我們指的是他作爲(主/原結構)的成員,他已經被確立爲主指針。

6)那麼這是否會在由內部指針連接在一起的結構中構造無限循環的結構?

我在哪裏評論編譯器錯誤是我積極的地方我有問題。

7)首先,設置a.ptr =&a後;我們傳遞一個struct的初始化指針「ptr」到函數func2中,是嗎?

8)在第一個if語句中,它看起來像我們正在比較a-> word到a-> ptr-> num。我假設的意思是說:IF {屬於「a」指向的結構的成員「詞」等於成員「num」,屬於指針「ptr」指向的結構,「ptr是再次被指向指針「一」}這似乎是正確的,但我不認爲這是....

9)如果是真的,那麼下面的一行說添加了+1同樣的事情

10)我想最終打印出來的最終printf在打開func2之前打印出了什麼數字和字,或者func2中的一些指針是否改變了它們的值。

我將不勝感激您的意見和建議,我應該如何處理這個指針& &結構ptr-> member和/或structure.member在我腦海中的東西。

此外,我不確定這是否出現在我的問題,但我也很顫抖雙指針以及。如果有人能告訴我一個雙指針如何將自己整合到我的代碼中,那麼不會有太多麻煩?

謝謝

回答

0

a不是指針。您正在使用->運營商多次訪問非指針struct成員,這會給您帶來錯誤。

代碼中有很多錯誤。例如,您沒有爲*word分配內存。但是,在其存儲的值:

a.word = "wordOne"; 

你應該訪問結構成員numa.num

這裏是關於使用pointers to structures的教程,它可能會幫助你理解它。

0

在這段代碼中確實存在不少錯誤,爲了清楚起見,我會嘗試下載清單。

1.)是的,你可以在這裏傳遞一個指針,但是在解引用一個指針參數前需要檢查NULL。如果你現在養成這樣做的習慣,那麼你可以節省數不清的時間來追蹤分段故障的來源。

2)func1不會改變a->num

if(a->num % 10 != 0) 
    { a->num *= 2; } 
// a->num % 10 = 20 % 10 = 0, and 0 != 0 is false 

此外,藍月亮是正確的約a->word,這可能是做正確的兩種方法之一。

隨着全球:

const char *global = "wordOne"; 

int main(int argc, char *argv[]) { 
    a.work = (char*)global; 
    /*...*/ 
} 

或者說藍月亮所指的首選方式:

const char *global = "wordOne"; 

int main(int argc, char *argv[]) { 
    size_t sz = sizeof(global); 
    a.work = (char*)malloc(sz); 
    for(int i = 0; i < sz; i++) { a.work[i] = global[i]; } 
    /*...*/ 
} 

注意:使用第二種方法,你最終需要free()內存。

更多一點的指針,你就會明白爲什麼

在問候func2(),此功能不使用指針參數,所以取消引用它肯定會拋出一個編譯錯誤。

void func2(struct foo); 
// struct foo is passed 'by value' 

我真的很希望能夠幫助你解決問題! :-)