2016-04-28 14 views
0

Beim Kompilieren des Programms unten gibt das Terminal mir die folgende Nachricht "doppelt frei oder Korruption (out)". Ich möchte ein Programm erstellen, das zuerst die Summe aller Elemente in einem Array berechnet, siehe x unten. Dann möchte ich die Summe aller Zahlen in einem Speicherblock berechnen, auf den ein Zeiger zeigt, siehe y unten. Ich glaube, dass das Problem in der Zuweisung "y = x;" liegt.Berechnen Sie die Summe aller Zahlen in einem Speicherblock und die Summe aller Elemente in einem Array

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

Der Zeiger 'y' wurde niemals von' malloc' zugewiesen (weil Sie sofort den Rückgabewert von 'malloc' überschreiben und verlieren). –

+1

Sie können keine Arrays in C zuweisen, Sie können ihnen Speicher zuweisen und dann die Werte mit 'memcpy' kopieren. Was Sie jetzt haben, ist ein Leck: Sie ordnen '10 * sizeof * y' zu (es sei denn' malloc' gibt 'NULL' zurück) und weisen dann' y' neu zu, um auf 'x' zu zeigen –

Antwort

5

Die Zuordnung y = x überschreibt die malloc() ed Zeiger und man am Ende einen Stapel free() ing variable dieundefiniertes Verhalten. Und auch der malloc() Ed-Zeiger ist nie free() Ed.

Aus Ihrem Code scheint es, dass Sie malloc() überhaupt nicht benötigen . Aber wenn es erforderlich ist, dann könnte das sein, was Sie brauchen,

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

Sie tatsächlich free() die Adresse x.

Sie könnten sum(x, 10) einfach anrufen.

1

Sie müssen nicht free() für verwenden, was über nicht zugeordnet malloc(), calloc() oder realloc() (einschließlich der Funktionen, die Zeiger zugewiesen über sie zurückkehren, zum Beispiel strdup()). Wenn Sie dies tun, bedeutet dies, dass Sie undefiniertes Verhalten aufrufen.

Zitat von N1570 7.22.3.3 Die freie Funktion:

Wenn ptr ein Nullzeiger ist, keine Aktion stattfindet. Andernfalls, wenn das Argument nicht mit einem Zeiger übereinstimmt, der früher von einer Speicherverwaltungsfunktion zurückgegeben wurde, oder wenn der Speicherplatz durch einen Aufruf von free oder realloc freigegeben wurde, ist das Verhalten undefiniert.

Die y = x; Linie verursacht Speicherverlust, weil es den Zeiger auf den zugewiesenen Puffer zu löschen und um die Adresse (erstes Element) zu xy zuweisen.

Verwandte Themen