2013-04-02 2 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; 
} 

на приведенном выше коде, я пытаюсь сохранить EXPONET в экспо в структуры из polynodeхранить Int в узле

но я перепробовал много способов, но ошибки продолжают появляться

не expo является int? почему я не могу хранить экспонент (int) в нем?

Я проверил несколько способов, когда я просто положить struct PolyTerm dataPtr; в структуры из polyNode

и polyNode->dataPtr.expo = exponet; в основном, это будет работать

Я думаю, потому что DataPtr указатель struct PolyTerm* dataPtr;

но я понятия не имею, чтобы это исправить.

может кто-нибудь объяснить мне, почему я не могу это сделать и каково его решение?

+1

какие ошибки вы получаете? –

+1

Полином не указывает ни на что. вы разыскиваете указатель NULL. Даже DataPtr имеет значение NULL. –

+0

Я использую Visual C++, и я могу запустить код, но после того, как я вставил экспоненту, сообщение окна выскочит и сказал, что перестало работать –

ответ

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

oh, на самом деле у меня есть выделение памяти для узла, но не для dataPtr, поэтому он не работал, я думал, что polyNodePtr является единственным указателем, я не думал, что мне нужно выделить указатель внутри него. Спасибо! –

+0

Пожалуйста, не бросайте результат 'malloc' в C. Это не обязательно, а некоторые даже [утверждают, что это плохая практика] (http://stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting -the-result-of-malloc), чтобы сделать это. –

0

Вы являетесь выводом указателя NULL.

polyNode == NULL

dataPtr == anything.

так polyNode->dataPtr->expo есть фактически (NULL)->dataPtr->expo. он не имеет значения. возникает ошибка сегментации, потому что вы пытаетесь получить доступ к ограниченной памяти. поэтому окна выходят из этого сообщения.

EDIT: спасибо @Nik за указание ошибок в моем ответе.

+0

Во-первых, 'dataPtr' не' NULL': это * ничего вообще *. 'polyNode-> dataPtr-> expo' на самом деле' (NULL) -> dataPtr-> expo' - разыменование указателя 'NULL' - это плохо. Во-вторых, 'polyNod' не является структурой - это * указатель * для структуры, а инициализация указателя на' 0' является абсолютно правильной и правильной. –

+0

@NikBougalis благодарит за то, что вы указали. исправил мой ответ. надеюсь, что это путает ОП. –

0

Память не было выделено PolyNodeAdr polyNode

Вы должны добавить это после провозглашения polyNode для polyNode->dataPtr->expo = exponet; работать

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

Обратите внимание на использование struct PolyNode не PolyNodeAdr, так как вы изменили PolyNodeAdr к указателю с ЬурейеЕ.

Также вы не должны набирать указатель, поскольку вы теряете информацию о том, что это указатель.

Например:

typedef struct PolyNode* PolyNodeAdr; 

Должно быть:

typedef struct PolyNode PolyNodeAdr; 

Так позже вы объявляете:

PolyNodeAdr * polyNode; 
+0

ok ty, но для typedef poitner, я думаю, что оба пути работают? –

+0

Да, конечно, оба пути будут работать, но один из них гораздо читабельнее. – 2013-04-02 01:45:43

+0

ОК, благодарю вас: D –

Смежные вопросы