2

リンクリストへの挿入に問題があります。これが私のコードです:

    for(j = 0; j < SIZE; j++) {
        body = (textFile*) malloc (sizeof(textFile));
        body->word = words[index[j]];
        if(head == NULL) {
            head = tail = body;
        }
        else {
            tail->next = body;
            tail = body;   
            cout << tail->word << endl;
        }
    }

ここで起こることは、リンクリストの15番目の要素を表示した後にプログラムがクラッシュすることです...理由はわかりません。indexはindex[20]={0}として宣言されています。SIZEは20として定義されているため、リンクリストにはwords配列内に20語すべてが含まれていると想定されます。その考えられる原因は何でしょうか?それはメモリ割り当てでしょうか?前もって感謝します :)

ここに私のコードの詳細があります。申し訳ありませんが、投稿するのは少し恥ずかしいです。コードエレガンスが苦手です。恩赦。

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    #define SIZE 20

    using namespace std;

    struct textFile {
        string word;
        struct textFile *next;
    };

    textFile *head, *body, *tail, *temp;

    int main() {
        ifstream wordFile("WORDS.txt", ios::in); // file object constructor
        /* stores words in the file into an array */
        string words[SIZE];
        char pointer;
        int i;
        for(i = 0; i < SIZE; i++) {
            while(wordFile >> pointer) {
                if(!isalpha(pointer)) {
                    pointer++;
                    break;
                }
                words[i] = words[i] + pointer;
            }
        }
        /* stores the words in the array to a randomized linked list */
        srand(time(NULL));
        int index[SIZE] = {0}; // temporary array of index that will contain         randomized indexes of array words
        int j = 0, ctr;
        // assigns indexes to array index
        while(j < SIZE) {
            i = rand() % SIZE;
            ctr = 0;
            for(int k = 0; k < SIZE; k++) {
                if(!i)
                    break;
                else if(i == index[k]) { // checks if the random number has         previously been stored as index
                    ctr = 1;
                    break;
                }
            }
            if(!ctr) {
                index[j] = i; // assigns the random number to the current         index of array index
                j++;
            }
        }
        /* makes sure that there are no double zeros on the array */
        ctr = 0;
        for(i = 0; i < SIZE; i++) {
            if(!index[i])
                ctr++;
        }
        if(ctr > 1) {
            int temp[ctr-1];
            for(j = 0; j < ctr-1; j++) {
                for(i = 0; i < SIZE; i++) {
                    if(!index[i]) {
                        int ctr2 = 0;
                        for(int k = 0; k < ctr-1; k++) {
                            if(i == temp[k])
                                ctr2 = 1;
                        }
                        if(!ctr2)
                            temp[j] = i;
                    }
                }
            }
            j = ctr - 1;
            while(j > 0) {
                i = rand() % SIZE;
                ctr = 0;
                for(int k = 0; k < SIZE; k++) {
                    if(!i || i == index[k]) {
                        ctr = 1;
                        break;
                    }
                }
                if(!ctr) {
                    index[temp[j-1]] = i;
                    j--;
                }
            }
        }
        head = tail = body = temp = NULL;
        for(j = 0; j < SIZE; j++) {
            body = (textFile*) malloc (sizeof(textFile));
            body->word = words[index[j]];
            if(head == NULL) {
                head = tail = body;
            }
            else {
                tail->next = body;
                tail = body;
                cout << tail->word << endl;
            }
            }
            temp = head;
        while(temp != NULL) {
            cout << temp->word << endl;
            temp = temp->next;
        }
        return 0;
    }
4

1 に答える 1

4

問題は、body構造体を初期化する方法にあります。

body = (textFile*) malloc (sizeof(textFile));

文字列が初期化されないため、文字列に割り当てようとするとセグメンテーション違反が発生します。代わりにC++newキーワードを使用する必要があります。

body = new textFile;

キーワードはnew、構造体とそれに含まれるオブジェクト参照にメモリを割り当てます。

こちらもご覧ください

于 2012-09-25T05:03:57.010 に答える