2013-04-02 139 views
0
#include <stdio.h> 
#include <stdlib.h> 

struct Fraction { 
    int num; 
    int denom; 
}; 

struct PolyTerm { 
    int expo; 
    struct Fraction coeff; 
}; 

struct PolyNode { 
    struct PolyTerm* dataPtr; 
    struct PolyNode* next; 
}; 

typedef struct Fraction* FractionAddr; 
typedef struct PolyNode* PolyNodeAdr; 
typedef struct PolyNode* PolyList; 

int main() { 
    int exponet; 
    PolyNodeAdr polyNode = 0; 

    printf("\n\tPlease Enter expoent: "); 
    scanf("%d", &exponet); 

    polyNode->dataPtr->expo = exponet; 

    //printf("\n%d\n",polyNode->dataPtr->expo); 

    return; 
} 

在上面的代碼中一個int,我想給exponet儲存至polynode存儲在節點

的結構的博覽會,但我嘗試過很多辦法,但失誤不斷出現

不是博覽會是一個int?爲什麼我不能將exponet(int)存儲到它中?

我查了一些方法,我只是把struct PolyTerm dataPtr;在polyNode

,並在主polyNode->dataPtr.expo = exponet;的結構,它的工作

我覺得因爲dataPtr是一個指針struct PolyTerm* dataPtr;

但我不知道要修復它

任何人都可以向我解釋爲什麼我不能這樣做,它的解決方案是什麼?

+1

你會得到什麼錯誤? –

+1

多節點不指向任何東西。您正在取消引用NULL指針。即使DataPtr是NULL。 –

+0

我使用的是Visual C++,而且我可以運行代碼,但是在插入exponet之後,窗口消息彈出並表示已停止工作 –

回答

0

你必須爲所有的指針,你會提領分配內存。在完成之後釋放內存。

int main() { 
    int exponet; 
    PolyNodeAdr polyNode = (PolyNodeAdr)malloc(sizeof(PolyNode)); 
    polyNode->dataPtr = (PolyTerm*)malloc(sizeof(PolyTerm)); 

    printf("\n\tPlease Enter expoent: "); 
    scanf("%d", &exponet); 

    polyNode->dataPtr->expo = exponet; 

    //printf("\n%d\n",polyNode->dataPtr->expo); 

    free(polyNode->dataPtr); 
    free(polyNode); 
    return 0; 
} 
+0

哦,實際上我有爲節點分配內存,但不是爲dataPtr,爲什麼它不工作,我認爲polyNodePtr是唯一的指針,我不認爲我需要分配裏面的指針。好的謝謝! –

+0

請不要將'malloc'的結果放在C中。這不是必要的,有的甚至是[認爲它是不好的做法](http://stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting - malloc的結果)來做到這一點。 –

0

您正在取消引用NULL指針。

polyNode == NULL

dataPtr == anything

因此polyNode->dataPtr->expo實際上是(NULL)->dataPtr->expo。它沒有意義。由於您嘗試訪問受限制的內存,因此存在分段錯誤。這就是爲什麼Windows彈出消息。

編輯:感謝@尼克指出我的答案中的錯誤。

+0

首先'dataPtr'不是'NULL':它*完全沒有*。 'polyNode-> dataPtr-> expo'實際上是'(NULL) - > dataPtr-> expo' - 解引用NULL指針是不好的。其次,'polyNod'不是一個結構 - 它是一個結構體的*指針,初始化一個指向'0'的指針是完全有效和正確的。 –

+0

@NikBougalis感謝您指出。糾正了我的答案。希望它能夠誤導OP。 –

0

沒有分配內存爲PolyNodeAdr polyNode

你有你的polyNode的聲明polyNode->dataPtr->expo = exponet;後加入這個工作

polyNode = malloc(sizeof(struct PolyNode)) ; 
polyNode->dataPtr = malloc(sizeof(struct PolyTerm)) ; 

struct PolyNodePolyNodeAdr使用,因爲你改變PolyNodeAdr到終場前的typedef。

而且你不應該的typedef指針,因爲你失去了這個名字是一個指針的信息。

例如:

typedef struct PolyNode* PolyNodeAdr; 

應該是:

typedef struct PolyNode PolyNodeAdr; 

所以後來你聲明:

PolyNodeAdr * polyNode; 
+0

好吧,但對於typedef poitner,我認爲這兩種方式都是工作? –

+0

當然,兩種方式都可以,但其中一種更具可讀性。 – 2013-04-02 01:45:43

+0

好的,謝謝:D –