2013-04-02 106 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 –