计算内存块中所有数字的总和以及数组中所有元素的总和

时间:2016-04-28 15:43:07

标签: c pointers

编译下面的程序时,终端会给我以下消息 “双重自由或腐败(出局)”。我想创建一个程序,首先计算数组中所有元素的总和,见下面的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;
}

2 个答案:

答案 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