Προς το περιεχόμενο

C realloc() ==> segmentation fault


Αbominable

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω δυναμικούς πίνακες και εαν γεμισουν, θέλω να τους προσθέτω νέο χώρο.Έχω φτιάξει μια συνάρτηση την resize_Bucket(), αλλά θελω όσο το δυνατον να την αποφύγω και να την χρησιμοποιήσω μόνο όταν δεν μου δουλέψει η realloc(). οπότε έω γράψει κάτι σαν και αυτό:

> [color=red]
if(!(bucket=realloc(bucket,newsize))){
printf("\nResize_Bucket is called..\n");
bucket=resize_bucket(bucket,nusize);
}[/color]

 

Δυστηχώς εαν κληθεί η realloc και δεν δουλέψει, μου πετάει segm fault. Υπάρχει κάποιος τρόπος να μην κολλήσει αλλά να συνεχίσει μέσα στην if ;;

 

Είναι λάθος η σκέψη μου;;

Δημοσ.

Edit: Η απάντηση του Sta φαίνεται να είναι η πιο σωστή για το πρόβλημά σου. Αν και χωρίς να δούμε τον κώδικα της resize_bucket() δεν μπορούμε να είμαστε ποτέ σίγουροι.

Δημοσ.

Ο κώδικάς σου φαίνεται γενικά σωστός, αρκεί να έχεις κάνει include <stdlib.h> βέβαια. Αν όντως όμως αποτύχει η realloc() και επιστρέψει NULL, η τιμή αυτή αποθηκεύεται στο bucket, οπότε καλείς τη συνάρτηση resize_bucket με πρώτο όρισμα NULL! (εξού και το Segfault).

 

Η λύση είναι η εξής:

 

>
temp = realloc(bucket,newsize);

if (!temp)
{
  /* Call resize_bucket */
}
else
  bucket = temp;

 

Σημειωτέον ότι σε κατάλληλο context η σταθερά NULL θεωρείται ίση με τον (ακέραιο) 0, εξού και επιτρέπονται τα if(temp), if(!temp) κ.τλ. αν ο temp είναι δείκτης. Δεν είναι όμως απαραίτητο η σταθερά NULL να είναι 0, δηλαδή όλα τα bits της να είναι 0.

Δημοσ.

Καταρχήν ευχαριστώ για τις απαντήσεις σας. Υπέθετα ότι εαν δεν δουλευε η realloc() δεν θα λειτουργούσε κ η ανάθεση.Μου δούλεψε αυτό που μου είχε προτείνει αρχικά ο Legionnaire..

Δημοσ.

Όντως, έχεις δίκιο.

 

Τι εννοείς σε κατάλληλο context; Δεν ισχύει 0==NULL στην C (στην C++ είναι άλλη ιστορία). Το NULL συνήθως ορίζεται σαν ((void*)0) οπότε δεν είναι ίσο με το 0 - εκτός από περίεργες μηχανές που το NULL έχει μια συγκεκριμένη τιμή !0.

Δημοσ.

Ήθελα να πω ότι μπορείς να γράψεις: if(p==0) και if (p!=0), που ισοδυναμούν με τα if(!p) και if(p) αντίστοιχα. Στην πρώτη έκφραση λοιπόν, αν p==NULL τότε p==0, που φαίνεται να σημαίνει ότι τα 0,NULL είναι ίσα. Για αυτό και είπα στο κατάλληλο context. Ίσως ήταν και ατυχής η έκφραση όμως. Σίγουρα τη χρησιμοποίησα σε αντιδιαστολή προς το ότι σαν σταθερά η NULL δεν είναι κατ' ανάγκη 0.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...