【问题标题】:Linked List Runtime Error after 15th Loop第 15 次循环后的链表运行时错误
【发布时间】:2012-09-25 03:43:11
【问题描述】:

我在插入链表时遇到问题。这是我的代码:

    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[20] = {0};并且 SIZE 定义为 20,因此链表应该包含单词数组中的所有 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;
    }

【问题讨论】:

  • 应用程序的输出是什么?
  • 数组index[]是什么?为什么你需要它而不是像words[j] 那样直接索引单词数组而不是words[index[j]]?也许您可以发布更多代码
  • 另外,看起来您正在将尾部和下一个节点都设置为主体。
  • 一个不相关的注释:pointer++;break; 无效。此值不再读取。
  • @AjiPorter,重点是...pointer 再也不会被读取了。

标签: c++ linked-list runtime-error


【解决方案1】:

问题在于您初始化主体结构的方式:

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

字符串没有被初始化,当你尝试分配给它时会导致分段错误。您应该改用 C++ new 关键字:

body = new textFile;

new 关键字将为结构以及其中包含的任何对象引用分配内存。

另见here

【讨论】:

  • 非常感谢先生!我可以问一个后续问题吗?为什么没有用malloc初始化字符串?我查看了您提供的链接,但这些术语对我来说太技术性了,比如非平凡的构造函数等等。我真的认为我会在 stackoverflow 中学到比在课堂上更多的东西。 :))
  • 'body = (textFile*) malloc (sizeof(textFile));'有什么区别和'body = new textFile'?对此感到抱歉,但这是我第一次遇到新的;我们班上还没有讨论过。 :(
  • 我才意识到我是个白痴。 body = (textFile*) malloc (sizeof(textFile)); 用于 C,body = new textFile 用于 C++。抱歉,我刚刚通过搜索 SO 中的其他链接列表问题找到了这个。再次感谢@mikeyq6! :) 这是我得到启发的链接:stackoverflow.com/questions/9662738/… :D
  • 不用担心 :) 是的,malloc 来自 C,但如果您在结构中使用 C 样式的字符串,也可以在 C++ 中使用,即。 char *word 不要忘记在程序结束时使用 delete 关键字释放分配给节点的内存。
猜你喜欢
  • 1970-01-01
  • 2017-06-28
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多