C 调整数组大小后的分段错误
我正在尝试实现一种算法,该算法将单词按字母顺序排列,长度不超过100个字符。 我的想法是使用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>
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调用失败。错误,它显示的是您现有的代码,由于标志/中断
之类的原因,它将永远不会读取第二行。学会使用