2016-04-28 60 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

相關問題