【发布时间】:2021-10-07 05:55:38
【问题描述】:
我有一个二维指针数组:
char **fields = calloc(1, sizeof(char *));
我添加不同的字符串,像这样:
if(i > 0) fields = realloc(fields, (i+1) * sizeof(char *));
fields[i] = calloc(size, sizeof(char));
然后我将memcpy 使用到fields[i] 所需的字符串中。
在程序结束时,当我尝试释放字段时,我会这样做:
int j=0
while(fields != NULL && fields[j]){
free(fields[j]);
j++;
}
free(fields);
程序在字段中插入 4 个字符串。
第一个字符串按预期释放,但在循环的第二次迭代 (j=1) 中,程序停止并输出错误:free(): invalid pointer
编辑:我做了一个有同样问题的小程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
char **fields = calloc(1, sizeof(char *));
int fieldsIndex = 0,i=0;
while (i<4) {
if(fieldsIndex > 0){
fields = realloc(fields, (fieldsIndex + 1) * sizeof(char *));
fields[fieldsIndex] =NULL;
printf("amount of field places: %d\n", (fieldsIndex + 1));
}
fields[fieldsIndex] = calloc(8, sizeof(char));
fields[fieldsIndex] = "88888888";
fieldsIndex++;
i++;
}
int j=0;
for(j=0; j<i; j++){
printf("field: %s\n", fields[j]);
free(fields[j]);
}
free(fields);
return 0;
}
谁能帮忙?
【问题讨论】:
-
额外的哨兵指针是什么意思?你能给我一个代码中的例子吗?谢谢
-
你给我们一个minimal reproducible example怎么样?呈现的代码片段本质上不是错误的,但它们可能依赖于不安全的假设。或者我有一个完全独立的问题。
-
当你释放它的时候,在这之前显然是错误的,但是你已经 nit 显示了该代码。您已经展示了
calloc()调用,但包含确定i值的代码,也没有其他可能破坏fields[1]的代码。本质上,您发布的任何代码都不包含导致问题的代码。 -
@ItaiElidan:让我数一数!不过我不打算猜测,您需要展示整个代码 - 堆损坏可能发生在任何地方。如果代码很大,您将不得不在一些较小的可重现示例中重现错误。如果你不能这样做,那么很明显你正在减少它的代码不是错误所在。
-
“哨兵指针”是数组结束处的额外空指针。您可以使用它来知道何时到达数组的末尾,就像“字符串”末尾的 nul 字符一样。