在C中对插入排序的字符串进行排序 - 分段错误

时间:2016-07-29 01:01:22

标签: c pointers memory segmentation-fault

我正在尝试调整我的数字排序插入排序代码来对字符串的输入文件进行排序,例如:

thickness
combed
revocable
escorted

但是,在尝试运行以下内容时,我遇到了分段错误(核心转储):

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

#define STRING_LEN  80
#define ARRAY_LEN   10000

void insertion_sort(char **a, int n) {
    int i;
    int j;
    char *key;

    for (i = 1; i < n; i++) {
        key = a[i];
        j = i - 1;

        while (strcmp(key, a[j]) == -1 && j >= 0) {
            a[j + 1] = a[j];
            j = j - 1;
        }
        a[j + 1] = key; 
    }
}

void *emalloc(size_t s) {
    void *result = malloc(s);
    if (NULL == result) {
        fprintf(stderr, "Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    return result;
}

int main(void) {
    int j;
    int num_words = 0;
    char word[STRING_LEN];
    char *wordlist[ARRAY_LEN];

    while (num_words < ARRAY_LEN && 1 == scanf("%79s", word)) {
        wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]);
        strcpy(wordlist[num_words], word);
        num_words++;    
    }

    insertion_sort(wordlist, num_words);

    for (j = 0; j < num_words; j++) {
        printf("%s\n", wordlist[j]);
    }

    return EXIT_SUCCESS;
}

通过将while条件更改为> 0而非>= 0

,我找到了
while (strcmp(key, a[j]) == -1 && j > 0)

除了第一个字符串之外,它排序所有内容,因为这是j0并且未输入循环,输出为:

thickness
combed
escorted
revocable

我是C的新手,我认为这与访问尚未分配的内存有关,但我很难看到哪里。

1 个答案:

答案 0 :(得分:3)

您的循环测试不正确:

while(strcmp(key,a[j]) == -1 && j>=0){

您应该检查} 之前的索引,并且您不应该依赖j返回strcmp() -1小于key 1}}。 a[j]仅被指定为为此案例返回负值。

strcmp()