【发布时间】:2021-10-31 04:17:47
【问题描述】:
我正在尝试在 C 中使用 realloc 函数来动态操作字符串的 char 数组 (char**)。 在 for 循环的第 41 个 cicle 之后,我通常会收到 realloc():invalid old size 错误,我真的不明白为什么。 所以,感谢所有帮助我的人^-^
[编辑] 作为这个社区的“新活跃成员”,我正在努力使帖子更加清晰并遵循您的建议,所以谢谢大家!
typedef struct _WordsOfInterest { // this is in an header file containing just
char **saved; // the struct and libraries
int index;
} wordsOfInterest;
int main() {
char *token1, *token2, *save1 = NULL, file[LEN], *temp, *word, **tokenArr;
int n=0, ch,ch2, flag=0, size, init=0,position,currEdit,init2=0,tempEdit,size_arr=LEN,
oldIndex=0,totalIndex=0,*editArr,counterTok=0;
wordsOfInterest toPrint;
char **final;
toPrint.index = 0;
toPrint.saved = malloc(sizeof(char*)*LEN);
editArr = malloc(sizeof(int)*LEN);
tokenArr = malloc(sizeof(char*)*LEN);
final = malloc(sizeof(char*)*1);
// external for loop
for(...) {
tokenArr[counterTok] = token1;
// internal while loop
while(...) {
// some code here surely not involved in the issue
} else {
if(init2 == 0) {
currEdit = config(token1,token2);
toPrint.saved[toPrint.index] = token2;
toPrint.index++;
init2 = 1;
} else {
if((abs((int)strlen(token1)-(int)strlen(token2)))<=currEdit) {
if((tempEdit = config(token1,token2)) == currEdit) {
toPrint.saved[toPrint.index] = token2;
toPrint.index++;
if(toPrint.index == size_arr-1) {
size_arr = size_arr*2;
toPrint.saved = realloc(toPrint.saved, size_arr);
}
} else if((tempEdit = config(token1,token2))<currEdit) {
freeArr(toPrint, size_arr);
toPrint.saved[toPrint.index] = token2;
toPrint.index++;
currEdit = tempEdit;
}
}
}
flag = 0;
word = NULL;
temp = NULL;
freeArr(toPrint, size_arr);
}
}
editArr[counterTok] = currEdit;
init2 = 0;
totalIndex = totalIndex + toPrint.index + 1;
final = realloc(final, (sizeof(char*)*totalIndex));
uniteArr(toPrint, final, oldIndex);
oldIndex = toPrint.index;
freeArr(toPrint,size_arr);
fseek(fp2,0,SEEK_SET);
counterTok++;
}
【问题讨论】:
-
realloc(toPrint.saved, size_arr)太小了。发布minimal reproducible example。 -
你在末尾多了一个
}。 -
您有一个
else,但没有if。 -
什么是
toPrint?它的成员有哪些?它是如何初始化的?您是否尝试过找到一些总是复制问题的案例?你试过调试吗?您是否尝试过在调试器中捕获崩溃? -
尝试做例如
realloc(toPrint.saved, sizeof(*toPrint.saved) * size_arr)代替。