编译下面的程序时,终端会给我以下消息 “双重自由或腐败(出局)”。我想创建一个程序,首先计算数组中所有元素的总和,见下面的x。然后我想要 计算指针指向的内存块中所有数字的总和,见下面的y。我认为问题在于作业“y = x;”
int main(void)
{
double x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("The sum is %f\n", sum(x, 10));
double *y = malloc(sizeof(double)*10);
y = x;
printf("The sum is %f\n", sum(y, 10));
free(y);
return 0;
}
答案 0 :(得分:5)
赋值y = x
会覆盖malloc()
ed指针,最终free()
堆栈变量 1 ,这是未定义的行为。此外,malloc()
ed指针永远不会free()
编辑。
从您的代码中,您似乎根本不需要malloc()
2 。但如果需要,那么这可能是你需要的
double *y;
y = malloc(10 * sizeof(*y));
if (y == NULL)
return -1;
for (int i = 0 ; i < 10 ; ++i)
y[i] = i + 1;
printf("The sum is %f\n", sum(y, 10));
free(y);
1 您实际上free()
x
的地址。
2 您可以致电sum(x, 10)
。
答案 1 :(得分:1)
您不能将free()
用于未通过malloc()
,calloc()
或realloc()
分配的内容(包括返回通过它们分配的指针的函数,例如,strdup()
)。如果这样做,则意味着您调用未定义的行为。
引自N1570 7.22.3.3免费功能:
如果ptr是空指针,则不执行任何操作。否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用free或realloc释放空间,则 行为未定义。
y = x;
行会导致内存泄漏,因为它会擦除指向所分配缓冲区的指针,并将x
的{first}的地址分配给y
。