在节点中存储int #包括 #包括 结构分数{ int-num; int-denom; }; 结构理工{ 国际博览会; 结构分数系数; }; 结构多项式{ struct PolyTerm*dataPtr; 结构多项式*下一步; }; typedef结构分数*fractidddr; typedef struct PolyNode*PolyNodeAdr; typedef struct PolyNode*多段列表; int main(){ int exponet; PolyNodeAdr polyNode=0; printf(“\n\t请输入expent:”); scanf(“%d”和exponet); polyNode->dataPtr->expo=exponet; //printf(“\n%d\n”,polyNode->dataPtr->expo); 返回; }

在节点中存储int #包括 #包括 结构分数{ int-num; int-denom; }; 结构理工{ 国际博览会; 结构分数系数; }; 结构多项式{ struct PolyTerm*dataPtr; 结构多项式*下一步; }; typedef结构分数*fractidddr; typedef struct PolyNode*PolyNodeAdr; typedef struct PolyNode*多段列表; int main(){ int exponet; PolyNodeAdr polyNode=0; printf(“\n\t请输入expent:”); scanf(“%d”和exponet); polyNode->dataPtr->expo=exponet; //printf(“\n%d\n”,polyNode->dataPtr->expo); 返回; },c,linked-list,C,Linked List,在上面的代码中,我试图将exponet存储在polynode结构的expo中 但我尝试了很多方法,但错误不断出现 世博会不是一个整数?为什么我不能将exponet(int)存储到其中 当我把struct PolyTerm dataPtr 和polyNode->dataPtr.expo=exponet基本上,它可以工作 我认为,因为dataPtr是一个指针struct PolyTerm*dataPtr 但我不知道该怎么做 有人能解释一下为什么我不能这样做,以及解决方法是什么吗?您正在解引用一个NU

在上面的代码中,我试图将exponet存储在polynode结构的expo中

但我尝试了很多方法,但错误不断出现

世博会不是一个整数?为什么我不能将exponet(int)存储到其中

当我把
struct PolyTerm dataPtr

polyNode->dataPtr.expo=exponet基本上,它可以工作

我认为,因为dataPtr是一个指针
struct PolyTerm*dataPtr

但我不知道该怎么做


有人能解释一下为什么我不能这样做,以及解决方法是什么吗?

您正在解引用一个
NULL
指针

polyNode==NULL

dataPtr==anything

所以
polyNode->dataPtr->expo
实际上是
(NULL)->dataPtr->expo
。它没有意义。存在分段错误,因为您试图访问受限内存。这就是windows弹出该消息的原因


编辑:感谢@Nik指出了我答案中的错误。

没有为
PolyNodeAdr polyNode

您必须在为
polyNode->dataPtr->expo=exponet声明polyNode之后添加此项开始工作

#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;
}
注意
struct PolyNode
not
PolyNodeAdr
的用法,因为您将
PolyNodeAdr
更改为typedef指针。

此外,您不应该键入定义指针,因为您会丢失名称是指针的信息

例如:

polyNode = malloc( sizeof( struct PolyNode )) ;
polyNode->dataPtr = malloc( sizeof( struct PolyTerm )) ;
应该是:

typedef struct PolyNode* PolyNodeAdr;
所以稍后你要声明:

typedef struct PolyNode PolyNodeAdr;

您必须为所有要取消引用的指针分配内存。完成后释放内存

PolyNodeAdr * polyNode;

你会得到什么错误?polynode不指向任何东西。您正在取消对空指针的引用。即使是DATAPTR也是空的。我使用Visual C++,我可以运行代码,但在插入了索引之后,窗口消息弹出并停止工作,你能再多加一些代码吗?@ KouSek——实际上,代码> DATAPTR <代码>可以是任何东西,甚至是土豆。首先,代码> DATAPTR <代码>不是代码> NULL>代码>:根本没什么。code>polyNode->dataPtr->expo
实际上是
(NULL)->dataPtr->expo
-取消对
NULL
指针的引用是错误的。其次,
polyNod
不是结构-它是指向结构的指针,初始化指向
0
的指针是完全有效和正确的。@NikBougalis感谢您指出它们。更正了我的答案。希望它不会误导OP。哦,实际上我有分配内存给节点,但没有分配给dataPtr,这就是为什么它不工作,我认为polyNodePtr是唯一的指针,我不认为我需要在它里面分配指针。好的,谢谢!请不要将
malloc
的结果转换为C。这不是必需的,有些人甚至可以这样做。好的,但是对于poitner的typedef,我认为两种方法都有效?是的,当然两种方法都有效,但其中一种更具可读性。
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;
}