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

C 调整数组大小后的分段错误,c,arrays,segmentation-fault,dynamic-memory-allocation,dynamic-arrays,C,Arrays,Segmentation Fault,Dynamic Memory Allocation,Dynamic Arrays,我正在尝试实现一种算法,该算法将单词按字母顺序排列,长度不超过100个字符。 我的想法是使用fgets()输入每个单词,然后检查其长度是否小于100个字符,如果是,则在相应调整大小后将其放入字符串数组中 但是,现在我在第37行得到一个segfault,它应该使用strcpy()函数将字符串放入我的字符串数组中 我很确定数组的大小调整是导致错误的原因。这是因为segfault仅出现在第二个字(即while循环的第二次迭代)处 这是我使用的代码: #include <stdlib.h>

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

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

我很确定数组的大小调整是导致错误的原因。这是因为segfault仅出现在第二个字(即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]);
    }
}
#包括
#包括
#包括
#包括
int cmpstr(常数无效*a,常数无效*b){
常量字符*aa=*(常量字符**)a;
常量字符*bb=*(常量字符**)b;
返回strcmp(aa,bb);
}
int main(int argc,char*argv[]){
//用于检查字长的缓冲区数组
char barray[102];
char*buffer=barray;
//主数组指针
字符**列表;
list=(char**)calloc(1,sizeof(char*);
//如果calloc失败
if(list==NULL){
perror(“calloc()在主数组中失败”);
返回-1;
}
//第一个字符串的内存分配
list[0]=(char*)calloc(102,sizeof(char));
如果(列表[0]==NULL){
perror(“calloc()在第一个数组元素失败”);
返回-1;
}
//字符串数组索引
int计数器=0;
//打印标志
int标志=0;
//创建未排序的列表
while(fgets(缓冲区,103,标准输入)!=NULL){
//断点1
如果(缓冲区[0]='\n'){
打破
}
对于(int i=0;i<101;i++){
//如果单词的长度是合法的而不是最后一个
如果(缓冲区[i]='\n'){
缓冲区[i]='\0';
strcpy(列表[计数器],缓冲区);//第二次迭代时的segfault
计数器++;
列表=realloc(列表,(计数器+1)*大小(字符*);
list[counter]=(char*)calloc(102,sizeof(char));
flag=1;
打破
}
}
如果(标志==1){
flag=0;
打破
}   
//如果单词太长
如果(缓冲区[100]!='\0'){
printf(“单词太长了!”);
}
否则{
strcpy(列表[计数器],缓冲区);
计数器++;
}
}
//排序表
qsort(列表、计数器、sizeof(char*)、cmpstr);
//打印列表
对于(int i=0;i

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

是的,看起来你设置了
list=(char**)calloc(1,sizeof(char*)
这意味着在
列表中只有一个
char*
的空间。因此,当您试图
strcpy
进入
list[1]
时,您会出错。

如何编译和运行?您不应该在只能容纳102个字节的缓冲区中设置最多103个字节。此外,在while结束时,您增加了计数器,但没有重新分配,因此,似乎下一个strcpy调用失败。错误,它显示的是您现有的代码,由于
标志/中断
之类的原因,它将永远不会读取第二行。学会使用