2016-07-22 5 views
1

ich eine einfache Skalarprodukt-Funktion auf einem mbed LPC1768 schrieb:Funktion lokale Variable zwischen Funktion weiterhin bestehen ruft

float dotProduct(float a[], float b[], int length){ 
    float sum; 
    int i; 
    for (i = 0; i < length; i++){ 
     sum = sum + a[i]*b[i]; 
    } 
    return sum; 
} 

Ich habe zwei Anrufe dotProduct in einer Reihe in meinem Programm, das (zum Testen) dot zwei 128-Element 1-Vektoren ({1,1,1 ... 1}) und drucken sie seriell. Also das erwartete Ergebnis sollte nur 128 und 128 sein. Die Variable sum scheint jedoch zu bestehen, weil ich 128 und 256 bekomme. Außerdem, wenn ich die float sum Deklaration zu float sum = 0 ändere, bekomme ich das gewünschte Ergebnis von 128 und 128. Die Variable sum ist nicht statisch, warum bleibt es zwischen Funktionsaufrufen bestehen? Danke

+0

Sie eine nicht initialisierte Variable -> Ergebnisse in undefinierten Verhalten. –

Antwort

0

Sie haben UB wie Sie von einer nicht initialisierten Variable lesen und es ist ziemlich nutzlos zu diskutieren, welche besonderen Nebenwirkungen von undefiniertem Verhalten Sie haben.

3

Das Problem mit "Persistenz" ist, dass sum nicht initialisiert verwendet wird, was zu undefiniertem Verhalten führt. In Ihrem Fall jedoch wird sum an der gleichen Stelle im Speicher zugewiesen, wo es während des vorherigen Aufrufs war, wodurch eine Illusion von "Persistenz" erzeugt wird.

Beachten Sie, dass Ihr Compiler wahrscheinlich eine Warnung an Sie ausgegeben hat, die Sie nicht ignoriert haben sollten.

Fix dieses Problem durch Initialisierung auf Ihre Variablen hinzufügen, bevor sie mit:

float sum = 0; 
for (int i = 0; i < length; i++){ 
    sum = sum + a[i]*b[i]; 
} 
Verwandte Themen