1

変数 fp2 で表されるファイル parent2.txt への書き込み中にセグメンテーション違反が発生しました。プログラムが実行を停止した行と、問題の原因となった行にコメントを入れました。セグメンテーション違反は、値を指定したと思っていたにもかかわらず、「temp4.value」が null に設定された結果であると推測しています。「temp2 = *temp2.​​next」という行に問題があるようです。temp2 は、子構造体の変数です。コードの何が問題なのか正確にはわかりません。これは私が助けを必要としているものです。これが私のコードです:

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

typedef struct Parent
{
    char *value;
    struct Child *next;
    int numChildren;
}Parent;

typedef struct Child
{
    char *value;
    struct Child *next;
    Parent *prev1;
    struct Child *prev2;
}Child;

int isFirst(int parent[], int index)
{
    int i;
    for (i = 0; i < index; i++)
    {
        if (parent[i] == parent[index])
        {
            return 0;
        }
    }
    return 1;
}

int addChild(Parent parents[], int index, char *num)
{
    int i;
    Child temp, temp2;
    temp.value = num;
    if (parents[index].numChildren == 0)
    {
        parents[index].next = &temp;
        temp.prev1 = &parents[index];
        temp.prev2 = NULL;
    }
    else
    { 
        for (i = 0; i < parents[index].numChildren; i++)
        {
            if (i == 0)
            {
                temp2 = *parents[index].next;
            }
            else
            {
                temp2 = *temp2.next; // setting temp2 to null?
            }
        }
        temp.prev1 = NULL;
        temp.prev2 = &temp2;
        temp2.next = &temp;
    }
}

int main() { 

    FILE *fp, *fp2;
    char read_file [256];
    char current[256];
    char space = ' ';
    char *curr2, *curr3;
    int i, index;
    int j = 0;
    int parent[] = {1, 1, 1, 3, 3, 4, 4, 1};
    int child[] = {3, 4, 5, 7, 8, 10, 11, 100};
    Parent parents[10];
    Parent temp;
    Child temp2, temp3;
    int numParents = 0;
    int done = 0;

    fp = fopen ("/home/sam/parent.txt","w+");

    if (fp == NULL) {
        printf ("Error opening file: %s\n", strerror(errno));
        exit(1);
    }




    for (i = 0; i < 8; i++)
    {
        fprintf(fp, "%d", parent[i]);
        fprintf(fp, " ");
        fprintf(fp, "%d", child[i]);
        fprintf(fp, "\n");
    }

    for (i = 0; i < 8; i++)
    {
        fgets(current, 7, fp);
        printf("%s\n", current);
        curr2 = strtok(current, &space);
        if (isFirst(parent, i) == 1)
        {
            parents[numParents].value = curr2;
            parents[numParents].numChildren = 0;
            numParents++;
        }
        printf("%s\n", curr2);
        curr3 = strtok(NULL, &space);
        while (done == 0)
        {
            temp = parents[j];
            index = j;
            if (temp.value == curr2)
            {
                done = 1;
            }
            j++;
        }
        j = 0;
        printf("\n");
        addChild(parents, numParents-1, curr3);
        parents[index].numChildren++;
        printf("%s\n", curr3);
        done = 0;
    }

    fp2 = fopen ("/home/sam/parent2.txt","w+");

    if (fp2 == NULL) {
        printf ("Error opening file: %s\n", strerror(errno));
        exit(1);
    }

    Child temp4;

    for (i = 0; i < 3; i++)
    {
        fprintf(fp2, "%s", parents[i].value);
        temp4 = *parents[i].next;
        for (j = 0; j < parents[i].numChildren; j++)
        {
            fprintf(fp2, "%s", temp4.value); // segmentation fault occuring on this line second time through inner loop
            fprintf(fp2, " ");
            if (j < parents[i].numChildren-1)
            {
                temp4 = *temp4.next;
            }
        }
        fprintf(fp2, "\n");
    }
    rewind(fp2);
    for (i = 0; i < 3; i++)
    {
        fgets(current, 100, fp2);
        printf("%s\n", current);
    }
    fclose(fp);
    fclose(fp2);
    return 0;
}
4

1 に答える 1

0

あなたの問題は、addChild関数ですでにここで始まっていると思います

int addChild(Parent parents[], int index, char *num)
{
    int i;
    Child temp, temp2;
    temp.value = num;
    if (parents[index].numChildren == 0)
    {
        parents[index].next = &temp;     // <---
        temp.prev1 = &parents[index];
        temp.prev2 = NULL;
    }

ローカル変数のアドレスをParent構造体のメンバーに割り当てます。関数が戻ると、これは消えたオブジェクト (ダングリング ポインター) を指します。

後でそのポインターを使用すると、あらゆる種類の問題が発生します。

   

于 2012-06-23T02:25:29.460 に答える