2017-12-03 5 views
1

Ich versuche, eine Funktion zu erstellen, die als Ergebnis die Summe der Elemente im Array zurückgibt. Wenn ich versuche, das Programm auszuführen, erhalte ich einen Segmentierungsfehler. Könnte mir bitte jemand in die richtige Richtung zeigen? Vielen Dank!Segmentierungsfehler beim Versuch, Elemente eines Arrays hinzuzufügen

int arraySum (int array[], int numberOfElements) { 
int result = 0; 

for (int i = 0; i < numberOfElements; i++) 
{ 
    result += array[i]; 
} 

return result; 
} 

int main (void) { 
int numberOfElements; 
int *array = NULL; 

printf("How many elements would you like in your array: "); 
scanf("%i", &numberOfElements); 

printf("\nPlease list the values of the elements in the array: "); 

for (int i = 0; i < numberOfElements; i++) 
{ 
    scanf("%i", &array[i]); 
} 

int result = arraySum(array, numberOfElements); 

return result; 
} 
+0

Sie sollten in 'malloc' schauen. –

+0

Sie können dem Speicher, den Sie nicht zugewiesen haben, keine Werte zuweisen. Verwenden Sie 'malloc' oder ähnliches, um einen Teil des Speichers zuzuweisen, bevor Sie dem Array Werte zuweisen. –

Antwort

0

Das Problem, das Sie haben, ist, dass Sie in C den Speicher manuell zuweisen müssen, wenn Sie einen Zeiger anstelle eines Arrays fester Größe verwenden.

Dies geschieht normalerweise durch Aufruf von malloc, die einen void-Zeiger (void *) zurückgibt, den Sie in den gewünschten Typ (in Ihrem Fall (int *)) umwandeln müssen, bevor Sie ihn zuweisen.

Es ist auch wichtig zu beachten, dass, wenn Sie malloc verwenden, Sie die Anzahl der Bytes angeben müssen, die Sie zuweisen möchten. Dies bedeutet, dass Sie es nicht einfach mit der Anzahl der Ganzzahlen aufrufen können, die Sie speichern möchten, sondern diese Zahl mit der Anzahl der Bytes multiplizieren, die eine ganze Zahl belegt (was von der verwendeten Hardware und dem verwendeten Betriebssystem abhängt) Zu diesem Zweck sollten Sie sizeof (int) verwenden, das zur Kompilierungszeit diese Größe auswertet.

ich modifizierte Code mit einem Arbeits Beispiel dafür, wie es getan werden könnte:

#include <stdio.h> 
#include <stdlib.h> 


int arraySum (int array[], int numberOfElements) { 
    int result = 0; 

    int i; 
    for (i = 0; i < numberOfElements; i++) { 
     result += array[i]; 
    } 

    return result; 
} 

int main(int argc, char **argv) { 
    int numberOfElements; 
    int *array = NULL; 

    printf("How many elements would you like in your array: "); 
    scanf("%i", &numberOfElements); 

    array = (int*) malloc(numberOfElements * sizeof(int)); 

    printf("\nPlease list the values of the elements in the array: "); 

    int i; 
    for (i = 0; i < numberOfElements; i++) { 
     scanf("%i", &array[i]); 
    } 

    int result = arraySum(array, numberOfElements); 

    printf("\n\nThe result is: %d\n", result); 

    return 0; 
} 

Sie auch das Ergebnis in Ihrer Hauptfunktion zurückzukehren versuchen, aber der Rückgabewert von Haupt in C wird verwendet, um signalisieren, ob Ihr Programm ohne Fehler beendet wurde (signalisiert durch einen Rückgabewert von 0) oder keine Probleme aufgetreten sind (ein anderer Wert als 0).

+0

Auch um zu verdeutlichen: Der Segmentierungsfehler, den Sie erhalten, signalisiert, dass Sie versucht haben, auf eine illegale Adresse im Speicher zuzugreifen, was passiert, da Sie keinen Speicher für Ihr Array zugewiesen haben und auf NULL zeigt (was eine Adresse ist, die ist dereferenziert) – C8263A20

0

Sie müssen Speicher reservieren. Es reicht nicht aus, nur einen Zeiger zu deklarieren. Sie tun es wie folgt aus: array=malloc(numberOfElements*sizeof(*array));

Auch, obwohl es möglich ist, result von der main Funktion zurückzukehren, sollten Sie das nicht tun. Der Rückgabewert von main wird normalerweise zur Fehlerprüfung verwendet. Ändern Sie das Ende Ihres Programms in

0 zurückgeben bedeutet in der Regel, dass kein Fehler aufgetreten ist.

Verwandte Themen