2016-04-28 62 views
0

当编译下面的程序时,终端给我下面的消息 “double free or corruption(out)”。我想创建一个程序,首先计算数组中所有元素的总和,参见下面的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

指针'y'永远不会被'malloc'分配(因为您立即覆盖并丢失'malloc'的返回值)。 –

+1

你不能在C中分配数组,你可以为它们分配内存,然后使用'memcpy'复制值。你现在有一个漏洞:你正在分配'10 * sizeof * y'(除非'malloc'返回'NULL'),然后重新赋值'y'指向'x' –

回答

5

分配y = x覆盖malloc()编指针和你最终free()荷兰国际集团堆栈变量这是未定义的行为。而且,malloc() ed指针从来不是free() ed。

从您的代码看来,您根本不需要malloc() 。但是,如果它需要那么这可能是你需要

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); 

你什么x实际上free()地址。

您可以拨打sum(x, 10)

1

不得使用free()什么不通过malloc()calloc()realloc()(包括通过返回他们分配的指针,例如功能,strdup())分配。如果这样做,这意味着您调用未定义的行为

若ptr为空指针,不发生任何动作:

N1570 7.22.3.3 free函数引用。否则,如果 参数与先前由内存管理 函数返回的指针不匹配,或者空间已被释放或realloc调用解除分配,则行为未定义。

y = x;行导致内存泄漏,因为它会删除该指针分配的缓冲区,并分配的地址(第一元件)xy

相关问题