Абсолютно не вижу, что вызывает ошибку сегментации, даже через 2 дня - PullRequest
0 голосов
/ 21 мая 2018

нормально Проблема с printf в основном.Я не программист, и это немного самоучка, так что не убивайте меня.Функция creation_noe создает связанный список нулей.Если мы хотим 3 из них, тогда ссылка будет начинаться с той, которая пронумерована как 3, но printf в основном дает мне 1 3 3. Я потерян.Спасибо за вашу помощь.

PS: программа намного длиннее, это только необходимая часть.если у вас есть вопрос, я здесь, чтобы ответить на них.Я просто не хочу, чтобы ты тратил время на отдых, который не имеет значения.спасибо:)

PPS: Термины на французском

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


struct matrice
{
    char nom[20];
    int n,m;
    double **tab;
    struct  matrice *next;
};


struct element
    {
        int num;
        int n1, n2;
        double k;
        struct element *next;
    };

    struct noeud
    {
        int num;
        double u;
        double f;
        struct noeud *next;
    };

    struct maillage
    {
        int nb_noe, nb_elt;
        struct noeud *lst_noe;
        struct element *lst_elt;
        struct matrice *K, *U, *F;
    };

    typedef struct element* elements;
    typedef struct noeud* noeuds;
    typedef struct maillage* maillages;


    /*==============================================*/
    /*               Recherche       */
    /*==============================================*/

    noeuds recherche_noe(maillages mail,int num){
        int i;
        maillages temp=mail;
        printf("%d %d ",num,mail->lst_noe->num);

        while((temp->lst_noe!=NULL) && (temp->lst_noe->num!=num)){
            temp->lst_noe=temp->lst_noe->next;
        }
        if(temp->lst_noe->num==num){
            return temp->lst_noe;
        }
        return NULL;
    }

    /*==============================================*/
    /*                   creation                   */
    /*==============================================*/



    void creation_noeud(maillages mail){
        int i;
        noeuds new = (noeuds)malloc(sizeof(struct noeud));
        mail->lst_noe=NULL;

        for (i=0;i<mail->nb_noe;i++){
            new->num = i+1;
            printf("Deplacement du noeud %d: ",new->num);
            scanf("%lf", &new->u);




            new->next=mail->lst_noe;
            mail->lst_noe=new;
        }
    }

    int main(){
        int i;
        maillages mail=malloc(sizeof(struct maillage));

        printf("Donner le nombre de noeuds voulu: ");
        scanf("%d",&mail->nb_noe);
        printf("Donner le nombre d'elements voulu: ");
        scanf("%d",&mail->nb_elt);
        creation_noeud(mail);
        //creation_element(mail);
        printf("aaa %d %d %d aaa \n",1,mail->lst_noe->num,mail->lst_noe->next->num,mail->lst_noe->next->next->num);
    }

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я настоятельно рекомендую использовать инструмент для выявления проблемы в будущем.

Valgrind хорош для обнаружения ошибок памяти.Вы компилируете свою программу с флагами отладки (опция -g) и затем запускаете valgrind ./<myprogram> . Вам понадобится установить valgrind.

Также, если вы используете компилятор clang, вы можете использовать опцию компилятора -fsanitize=memory.

Обе эти методики сообщат вам строку кода, которая вызывает ошибку памяти.

0 голосов
/ 21 мая 2018
mail->lst_noe=NULL;

...

new->next=mail->lst_noe;
mail->lst_noe=new;


and then

mail->lst_noe->next->next->num

Это обязательно даст segfault, поскольку mail->lst_noe->next - это не что иное, как mail->lst_noe, которое само по себе равно NULL.Разыменование нулевого указателя дает вам SEGFAULT.

...