分段错误11,尽管分配了大量内存

时间:2015-04-21 17:52:57

标签: c string memory structure

我遇到了一个奇怪的错误。当我编译我的代码时,它给了我以下消息:

%i??
[R?
R?
?
Desktop/prog2
Terminal
51/sls2t0f16cd4dzl3640n4p2w0000gn/T/
private/tmp/com.apple.launchd.AJrzeyltFv/Render
ION=343.6
ER=Frank
Listeners
in:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
ank
E=/Users/Frank
nk/Desktop/prog2

Segmentation fault: 11
logout

我知道这是由于内存问题造成的。但是,我给了dictionary2与原始字典相同的内存,为什么它不能编译整个列表呢?

这是我的代码(我知道这有点偏长,但我觉得有必要传达正在发生的事情):

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

struct entry
{
    char word[15];
    char definition[50];
};


void dictionarySort(struct entry dictionary[]) {
    int i, j, k, word1, word2, dict2Length = 1;
    bool bnf = false;
    struct entry dictionary2[100] = {{}};

    for (i = 0; i <= strlen(&dictionary->word[0]); i++) {
        strcpy(&dictionary2[0].word[i], &dictionary[0].word[i]);
    }


    i = 0;
    word1 = 1;
    word2 = 0;



    while (isalpha(dictionary[word1].word[0])) {

        while (i <= strlen(&dictionary->word[word1])) {
            //printf("%c", dictionary[word1].word[i]);
            if (dictionary[word1].word[i] == dictionary2[word2].word[i]) {
                i++;
                bnf = false;
            }
            else if (dictionary[word1].word[i] < dictionary[word2].word[i]) {
                //insert section to prevent back-and-forth cycling
                if (bnf == false) {
                    word2--;
                    bnf = true;
                }
                else { //(dictionary[word1].word[i] < dictionary[word2].word[i])
                    //open up new index by moving everything above up one, insert at word
                    for (j = dict2Length; j > word2; j--) {
                        //word
                        for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
                            strcpy(&dictionary2[j+1].word[k], &dictionary2[j].word[k]);
                        }
                        //definition
                        for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
                            strcpy(&dictionary2[j+1].definition[k], &dictionary2[j].definition[k]);
                        }
                    }

                    //for (k = 0; k < strlen(&dictionary1->word[word1]))
                    for (k = 0; k < strlen(dictionary[word1].word); k++) {
                        strcpy(&dictionary2[word2].word[k], &dictionary[word1].word[k]);
                    }
                    for (k = 0; k < strlen(dictionary[word1].definition); k++) {
                        strcpy(&dictionary2[word2].definition[k], &dictionary[word1].definition[k]);
                    }
                    dict2Length++;
                    break;
                }   
            }
            else {
                //insert section to prevent back-and-forth cycling
                if (bnf == false) {
                    word2++;
                    bnf = true;
                }
                else { //(dictionary[word1].word[i] < dictionary[word2].word[i])
                    //open up new index by moving everything above up one, insert at word
                    for (j = dict2Length; j > word2; j--) {
                        //word
                        for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
                            strcpy(&dictionary2[j+1].word[k], &dictionary2[j].word[k]);
                        }
                        //definition
                        for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
                            strcpy(&dictionary2[j+1].definition[k], &dictionary2[j].definition[k]);
                        }
                    }

                    for (k = 0; k < strlen(dictionary[word1].word); k++) {
                        strcpy(&dictionary2[word2].word[k], &dictionary[word1].word[k]);
                    }
                    for (k = 0; k < strlen(dictionary[word1].definition); k++) {
                        strcpy(&dictionary2[word2].definition[k], &dictionary[word1].definition[k]);
                    }
                    dict2Length++;
                    break;
                }
            }
        }
        word1++;
    }


    word2 = 0;

    for (i = 0; i < dict2Length; i++) {
        printf ("%s\n", dictionary2[i].word);
    }

}

int main (void) {
    struct entry dictionary[100] = 
    {{"aerie", "a high nest"},
    {"abyss", "a bottomless pit"},
    {"ahoy", "a nautical call of greeting"},
    {"addle", "to become confused"},
    {"aardvark", "a burrowing African mammal"},
    {"agar", "a jelly made of seaweed"},
    {"acumen", "mentally sharp; keen"},
    {"aigrette", "an ornamental cluster of feathers"},
    {"affix", "to attach"},
    {"ajar", "partially opened"}};
    dictionarySort(dictionary);
}

3 个答案:

答案 0 :(得分:2)

这一行的索引回到前面

strcpy(&dictionary2[0].word[i], &dictionary[0].word[i]);    

应该是

strcpy(&dictionary2[i].word[0], &dictionary[i].word[0]);

甚至更好

strcpy(dictionary2[i].word, dictionary[i].word);

此外,您的循环for (i...)基于strlen(&dictionary->word[0])。您是否应该将数组条目的数量作为参数传递给dictionarySort()?就目前而言,循环基于第一个字典条目的长度。

我必须传递调试排序。太可怕了。只需使用qsort()

答案 1 :(得分:2)

使用qsort

void dictionarySort(struct entry dictionary[]) {
    struct entry dictionary2[100] = {{"",""}};
    int i, n;

    for (i = 0; i < 100 && dictionary[i].word[0] != '\0'; ++i){
        dictionary2[i] = dictionary[i];
    }
    n = i;

    qsort(dictionary2, n, sizeof(*dictionary2), strcmp);

    for (i = 0; i < n; ++i) {
        printf ("%s\n", dictionary2[i].word);
    }
}

答案 2 :(得分:1)

看起来你在计算词典长度方面遇到了麻烦。当你运行它时,它表示长度类似于1701996321,这看起来要比它应该高得多。然后,在最后一个for循环中,直到你打印单词的结尾,你可能超出了字典的范围。注释掉printf,你会看到错误消失了。我首先考察dict2Lenght。

for (i = 0; i < dict2Length; i++) {
    printf ("%s\n", dictionary2[i].word);
}