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

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

Δημοσ.

Να ξέρεις ότι δεν έχουν σημασία τα μεγέθη που δίνεις για το αν θα πετύχει ή θα αποτύχει η realloc. Για να μην γίνομαι ανακριβής, ΕΧΟΥΝ αλλά όχι στο context που νομίζεις εσύ. H realloc συνήθως αποτυγχάνει λόγω κατακερματισμού του heap, δηλαδή δεν υπάρχουν αρκετές συνεχόμενες θέσεις μνήμης ελεύθερες στο heap ώστε να δεσμευθούν. Άλλος λόγος είναι το ότι έχεις εξαντλήσει το virtual address space σου, δηλαδή δεν υπάρχει άλλη ελεύθερη μνήμη .

 

Επίσης, σου προτείνω να μην προγραμματίζεις με το σκεπτικό ότι κάτι σου κάνει για μια συγκεκριμένη περίπτωση, αλλά για το τι είναι καλό ΓΕΝΙΚΑ. Γιατί να μάθεις να κάνεις κάτι σωστά αργότερα, ενώ μπορείς να το κάνεις τώρα?

Δημοσ.

Δεν μας έχεις δώσεις κώδικα για να δούμε αν όντως το έλυσες το πρόβλημα, διάβασε όμως προσεχτικά αυτά που σου έχουν γράψει οι MitsakosGR & Erevis, καθώς και την τεκμηρίωση της realloc().

 

Η συνηθέστερη τακτική για την κληση τέτοιων συναρτήσεων είναι η 2η του Erevis, να επιστρέφεις NULL χωρίς να πειράζεις τον old αν αποτύχει η relloc()...

int *biggerTable(int *old, int old_size, int new_size)
{
  // sanity checks
  if ( !old ) {
    fputs( "*** internal error: invalid pointer\n", stderr );
    return NULL;
  }
  if ( new_size < 1 || new_size <= old_size ) {
    fputs( "*** internal error: invalid new_size\n", stderr );
    return NULL;
  }

  // το new_size ως ονομασία παραπέμπει σε εξαρχής σε bytes,
  // αν εννοούσες πλήθος στοιχείων, τότε consider να αλλάξεις το όνομα σε: new_elements_count
  // και να αντικατήσεις το 1ο όρισμα της realloc() που ακολουθεί με: new_elements_count * sizeof(int)
  int *try = realloc(old, new_size);
  if ( NULL == try ) {
    fputs( "*** internal error: realloc() failed\n", stderr );
    return NULL;
  }

  return try;
}

Κατόπιν όταν καλείς την συνάρτησή σου μπορείς να ελέγχεις επιτόπου για failure, κάπως έτσι...

int main( void )
{
   int *try = NULL;
   ...
   if ( NULL == (try=biggerTable(old, old_size, new_size)) )
     return 1;

   old = try;
   ...
   return 0;
}

EDIT:

 

Ξέχασα, αν θες να επιστρέφει silently η συνάρτησή σου σε τυχόν αποτυχία της realloc(), μπορείς να κάνεις απευθείας...

return realloc(old, newsize);

αμέσως μετά τα sanity checks, και να μεταφέρεις την loud επισήμανση στο σώμα της if, στην main(), που ελέγχει αν αποτυγχάνει η συνάρτηση.

 

Κάτι τέτοιο είναι inconsistant όμως (εκτός αν την κάνεις silent και στην περίπτωση που αποτύχουν τα sanity checks... αλλά τότε δεν θα έχει λόγο ύπαρξης η συνάρτηση, αφού ούτε λίγο ούτε πολύ θα ισοδυναμεί με μια απευθείας κλήση της realloc() ).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...