调整数组大小后的分段错误

时间:2017-08-18 00:25:34

标签: c arrays segmentation-fault dynamic-memory-allocation dynamic-arrays

我正在尝试实现一种算法,该算法按字母顺序对单词的长度为100个字符进行排序。 我的想法是使用fgets()接受每个单词,然后检查它的长度是否低于100个字符,如果是,则在相应调整大小后将其放入字符串数组中。

但是,现在我在第37行得到一个段错误,它应该使用strcpy()函数将字符串放入我的字符串数组中。

我很确定数组的大小调整是造成错误的原因。这是因为段错仅发生在第二个字(即while循环的第二次迭代)。

这是我用过的代码:

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

int cmpstr(const void* a, const void* b){
    const char* aa = *(const char**)a;
    const char* bb = *(const char**)b;
    return strcmp(aa,bb);
}

int main(int argc, char* argv[]){

    //buffer array to check word length
    char barray[102];
    char* buffer = barray;

    //main array pointer
    char** list;
    list = (char**)calloc(1, sizeof(char*));
    //if calloc fails
    if(list == NULL){
        perror("calloc() fails at main array");
        return -1;
    }

    //memory allocation for first string
    list[0] = (char*) calloc(102, sizeof(char));
    if(list[0] == NULL){
        perror("calloc() fails at first array element");
        return -1;
    }

    //string array index
    int counter = 0;

    //print flag
    int flag = 0;

    //create unsorted list
    while(fgets(buffer, 103, stdin) != NULL){
        //breakpoint 1
        if(buffer[0] == '\n'){
            break;
        }
        for(int i = 0; i < 101;i++){
            //if word is of legit length and not the last one
            if(buffer[i] == '\n'){
                buffer[i] = '\0';
                strcpy(list[counter], buffer); //segfault at 2nd iteration
                counter++;
                list = realloc(list, (counter + 1)  * sizeof(char*));
                list[counter] = (char*)calloc(102,sizeof(char));
                flag = 1;
                break;
            }
        }

        if(flag==1){
            flag = 0;
            break;
        }   
        //if word is too long
        if(buffer[100] != '\0'){
            printf("Word too long!");
        }
        else{
            strcpy(list[counter], buffer);
            counter++;
        }

    }

    //sort list
    qsort(list, counter, sizeof(char*), cmpstr);

    //print list
    for(int i = 0; i < counter; i++){
        printf("%s\n", list[i]);
    }

    //free memory
    for(int i = 0; i < counter; i++){
        free(list[counter]);
    }
}

PS:另外,请随意批评我的代码,或者如果你发现我犯了其他任何错误:)

1 个答案:

答案 0 :(得分:1)

好吧,看起来你设置了list = (char**)calloc(1, sizeof(char*));,这意味着char*中只有一个list的空间。因此,当您尝试strcpy进入list[1]时,您会发生段错误。