2016-06-28 3 views
-2

Ich schreibe ein Programm, um den Max und Mix-Wert eines int-Arrays zu finden, und I ', versuchen zu vermeiden, einen Int zu verwenden, um die aktuelle Position zu verfolgen, aber das Programm wirft segfault 11. Es wird nicht durchlaufen die Schleife. Was ist der Grund?Warum bekomme ich Segfault 11, während ich einen Zeiger verwende, um die aktuelle Position in einem Array zu verfolgen?

/* Finds the largest and smallest elements in an array */ 
#include <stdio.h> 
#define N 10 

void max_min(int a[], int n, int *max, int *min); 

int main(void){ 
int b[N], i, *big, *small; 
printf("Enter %d numbers: ", N); 
for (i = 0; i < N; i++) 
    scanf("%d", &b[i]); 
max_min(b, N, big, small); 
printf("Largest: %d\n", *big); 
printf("Smallest: %d\n", *small); 
return 0; 
} 

void max_min(int a[], int n, int *max, int *min){ 
    int *p; 
    *max = *min = *p = a[0]; 
    while (*p != EOF) { 
     if (*p > *max) 
      max = p; 
     else if (*p < *min) 
      min = p; 
     p++; 
    } 
} 
+0

http://ideone.com/GbsQ3q – BLUEPIXY

+0

1. Bitte geben Sie die Einbuchtung auszusortieren. 2, Use3 geschweifte Klammern - spart zukünftige Probleme –

+0

Kennen Sie den Unterschied zwischen '* p = i;' und 'p = & i;'? – immibis

Antwort

-3

In Zeile zwei von max_min Code ändern zu

max = min = p = a; 

Speicher ist wie eine lange Reihe von Schließfächern. Wenn Sie int *max; deklarieren, enthält die Variable max einfach eine Schließfachnummer, die Variable *max enthält alles in diesem Schließfach (das in diesem Fall ein int ist). Ein Array ist wie eine große Reihe von Schließfächern, a[0] ist Schließfach Nummer a + 0, a[1] ist Schließfach Nummer a + 1, und so weiter. Sie möchten p den Wert von a geben, wenn Sie ihn erhöhen, erhalten Sie den nächsten Array-Index.

+0

, die allen dieselbe Speicherposition zuweisen würde, was bedeuten würde, dass er später in dieser Funktion, wenn er versucht, ihnen unterschiedliche Werte zu geben, einen neuen Speicherort für jeden dieser Zeiger erstellen muss. – engineer14

+0

Wenn Sie sich seine Aufgabe ansehen, schreibt er 'max = p'. max und min zeigen einfach auf die Max- und Min-Werte im Array. Auch wenn sich Groß und Klein nach der Rückkehr überhaupt nicht verändert haben, habe ich das wohl vermasselt – Robert

0

Okay, es gab ein paar Bugs. Ich habe zwei Versionen produziert. Eine mit den Käfern kommentiert und eine zweite mit Dingen aufgeräumt.

Hier ist die kommentierte Version [bitte die unentgeltlichen Stil Bereinigungs verzeihen]:

/* Finds the largest and smallest elements in an array */ 
#include <stdio.h> 
#define N 10 

void max_min(int a[], int n, int *max, int *min); 

int 
main(void) 
{ 
    int b[N], 
    i, 
    *big, 
    *small; 

    printf("Enter %d numbers: ", N); 
    for (i = 0; i < N; i++) 
     scanf("%d", &b[i]); 

    // BUG1: big/small have not been initialized to point to anything 
    max_min(b, N, big, small); 

    printf("Largest: %d\n", *big); 
    printf("Smallest: %d\n", *small); 

    return 0; 
} 

void 
max_min(int a[], int n, int *max, int *min) 
{ 
    int *p; 

    // BUG2: because of BUG1 above, this will segfault 
    // BUG3: because p is never initialized, dereferencing it (via "*p") will 
    // segfault 
    *max = *min = *p = a[0]; 

    // BUG4: this will run past the end of the "a" array because there is 
    // no guarantee of a matching sentinel value (i.e. EOF/-1) 
    // in fact, using a sentinel is wrong because the "a" array can have _any_ 
    // value (i.e. there is _no_ sentinel value that can be used) 
    while (*p != EOF) { 
     // BUG5: when max or min gets set, we're changing what they point to 
     // but this will _not_ change caller's values 
     if (*p > *max) 
      max = p; 
     else if (*p < *min) 
      min = p; 
     p++; 
    } 
} 

Hier ist ein gereinigter und Arbeitsversion. Beachten Sie insbesondere die Änderung der big/small in Haupt von int * zu int mit einer entsprechenden Änderung im Aufruf von max_min:

/* Finds the largest and smallest elements in an array */ 
#include <stdio.h> 
#define N 10 

void max_min(int a[], int n, int *max, int *min); 

int 
main(void) 
{ 
    int b[N], 
    i, 
    big, 
    small; 

    printf("Enter %d numbers: ", N); 
    for (i = 0; i < N; i++) 
     scanf("%d", &b[i]); 

    max_min(b, N, &big, &small); 

    printf("Largest: %d\n", big); 
    printf("Smallest: %d\n", small); 

    return 0; 
} 

void 
max_min(int a[], int n, int *max, int *min) 
{ 
    int *p; 
    int val; 

    p = &a[0]; 
    *max = *min = *p; 

    for (int i = 0; i < n; ++i, ++p) { 
     val = *p; 
     if (val > *max) 
      *max = val; 
     else if (val < *min) 
      *min = val; 
    } 
} 
Verwandte Themen