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

Μια συνάρτηση που μου σπάει τα νεύρα (malloc)


FrAcTaL-gR

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

Δημοσ.

Καλησπέρα και καλώς σας βρίσκω,

μαθητευόμενος στη C, προσπαθώ να μάθω να χρησιμοποιώ σωστά την malloc, και όλο και κάποιο πρόβλημα ανακύπτει.

 

Εγραψα το παρακάτω πρόγραμμα, το οποίο χρησιμοποιεί ένα πίνακα δεικτών σε χαρακτήρες, και τυπώνει τα περιεχόμενα. Οπως φαίνεται απο την τιμή του SIZE, ο πίνακας έχει 7 θέσεις. Το πρόγραμμα λειτουργεί όπως ακριβώς περίμενα να λειτουργήσει, δηλαδή λειτουργεί σωστά.

 

>
#include <stdio.h>
#include <stdlib.h>    // malloc
#define SIZE 7

int main ( void )
{
     int i;
     char *array[ SIZE ];
     char *ptr;
     for ( i = 0; i < SIZE; i++ )
    {
         ptr = malloc ( 30 * sizeof( char ) );
         ptr = "hello\n";
         array[ i ] = ptr;
         printf( "array[ %d ] = %s\n", i, array[ i ] );
         
    }
    return 0;
} 

 

Τα περίεργα αρχίζουν όταν στο βρόχο for, αντικαταστήσω το i < SIZE με i < SIZE + 1

Το αποτέλεσμα εκτελείται κανονικά (!!!!) στον compiler που χρησιμοποιώ ( lcc win-32). Το πρόγραμμα, τώρα, τυπώνει 8 στοιχεία του πίνακα!!!

 

Να σημειώσω πως έχω ορίσει το warning level στο ανώτατο επίπεδο.

 

Και όταν γράψω i < SIZE + 2, τότε μόνο βγάζει runtime exception.

Η απορία μου είναι γιατί δεν βγάζει σφάλμα και στην περίπτωση i < SIZE + 1;

 

Ας σχολιάσουμε πρώτα αυτό, και στη συνέχεια έχω ακόμη πιο "φοβερά" μυστήρια! (σας δίνω μια 1η γεύση, παρατηρήστε οτι δεν αποδεσμεύω καθόλου μνήμη- με τη free(ptr) )

Δημοσ.

Αυτό συμβαίνει επειδή η C ξεκινάει να μετράει από το 0. Δηλαδή όταν ορίζεις έναν πίνακα array[10] ναι μεν έχει 10 θέσεις (ξεκινάει από το 0) αλλά η τελευταία του θέση είναι το array[9] και όχι το array[10]. Έτσι λοιπόν όταν βάζεις SIZE + 1, το i κάποια στιγμή γίνεται 10 και πηγαίνει στην θέση array[10] η οποία δεν περιέχει σωστά δεδομένα αλλά τυχαία δεδομένα της μνήμης (έχω την εντύπωση ότι κρατάει κάτι σαν το \0 που κρατάει ένας char πίνακας στην τελευταία του θέση, αλλά δεν είμαι καθόλου σίγουρος για αυτό).

Δημοσ.
Αυτό συμβαίνει επειδή η C ξεκινάει να μετράει από το 0. Δηλαδή όταν ορίζεις έναν πίνακα array[10] ναι μεν έχει 10 θέσεις (ξεκινάει από το 0) αλλά η τελευταία του θέση είναι το array[9] και όχι το array[10]. Έτσι λοιπόν όταν βάζεις SIZE + 1, το i κάποια στιγμή γίνεται 10 και πηγαίνει στην θέση array[10] η οποία δεν περιέχει σωστά δεδομένα αλλά τυχαία δεδομένα της μνήμης (έχω την εντύπωση ότι κρατάει κάτι σαν το \0 που κρατάει ένας char πίνακας στην τελευταία του θέση, αλλά δεν είμαι καθόλου σίγουρος για αυτό).

 

Να πω οτι στον βρόχο for έχω

for ( i = 0; i < SIZE; i++ )

και όχι

for ( i = 0; i <= SIZE; i++ )

 

αυτό σημαίνει οτι ο βρόχος εκτελείται ακριβώς 7 φορές και τυπώνει τα στοιχεία του πίνακα array[ 0 ] έως και array[ 6 ].

Οταν, όμως, βάλω SIZE+1, τότε ο βρόχος θα εκτελεστεί 8 φορές και θα εμφανίσει τα στοιχεία array[ 0 ] μέχρι array[ 7 ] !!!

Δημοσ.

Ναι, επειδή η θέση array[7] υπάρχει απλά δεν χρησιμοποιείται επειδή είναι η 8η τιμή του πίνακα.

Για παράδειγμα εαν έχεις ένα char name[20], το τελευταίο γράμμα είναι στο name[19] ενώ το null character βρίσκεται στο name[20].

Έτσι και στους πίνακες, η τελευταία θέση ενός πίνακα με 7 θέσεις είναι η array[6] αλλά υπάρχει και το array[7] χωρίς αυτό να χρησιμοποιείται.

 

Εάν διαβάσεις κάποιο documentation θα καταλάβεις καλύτερα γιατί έτσι όπως το εξήγησα μπερδεύτηκα και εγώ ο ίδιος :P

Δημοσ.

Δεν καταλαβαίνω τι θέλεις να κάνεις με αυτόν τον κώδικα, από ότι βλέπω δημιουργείς 7 δείκτες και οι 7 να δείχνουν σε ένα sting που είναι το "hello\n".

Γενικά αυτός ο κώδικας είναι άκυρος γιατί δεν κάνει τίποτα, μήπως θέλεις να δημιουργήσεις ένα πίνακα από strings και μέσα στην for() loop να τους δίνεις τιμή?

Γιατί βλέπω ότι κάτι τέτοιο προσπαθείς να κάνεις.

 

Επίσης όταν θέλεις καθαρά πχ 20 χαρακτήρες τότε ναι ορίζεις:

 

#define SIZE 20

 

αλλά στην malloc ή calloc δεσμεύεις SIZE+1 γιατί ο +1 πρόσθετος θα φυλάξει το '\0' που είναι και ο τελικός χαρακτήρας στο string σου, άρα σου μένουν καθαροί 20 χαρακτήρες.

 

Για ότι άλλο θέλεις και πιο συγκεκριμένο πες μου.

Δημοσ.
Ναι, επειδή η θέση array[7] υπάρχει απλά δεν χρησιμοποιείται επειδή είναι η 8η τιμή του πίνακα.

Αυτό δεν το είχα σκεφτεί! Εχω να μαθω πολλά ακόμη!!!

 

 

Για παράδειγμα εαν έχεις ένα char name[20], το τελευταίο γράμμα είναι στο name[19] ενώ το null character βρίσκεται στο name[20].

Εδώ έχω διαφορετική γνώμη. Οταν δηλώνουμε τον char name[ 20 ], τότε το σύστημα μας παρέχει 20 μπλοκ μνήμης, συνεχόμενα. Αυτά είναι τα name[ 0 ], έως name[ 19 ]. Προφανώς υπάρχει και το επόμενο μπλοκ (αυτό που ονομαζεις name[ 20 ] ), αλλά αυτό δεν περιέχει αναγκαστικά τον null character, αλλά κάποιο "σκουπίδι".

 

Έτσι και στους πίνακες, η τελευταία θέση ενός πίνακα με 7 θέσεις είναι η array[6] αλλά υπάρχει και το array[7] χωρίς αυτό να χρησιμοποιείται.

Με την ίδια λογική που ανέπτυξα παραπάνω, θα υπάρχουν και τα array[ 8 ] , array[ 9 ], κλπ, κλπ.

Δημοσ.

Και με την ίδια λογική φτιάχνεις ένα array[1] και χωράς όλη τη μνήμη του υπολογιστή σου :P

Έχει να κάνει με το μέγεθος της μνήμης που δεσμεύει η C. Σίγουρα θα υπάρχει και το array[8] και το array[9] αλλά θα υπάρχουν σαν θέσεις μνήμης και όχι σαν θέσεις του πίνακα που δήλωσες με 7 θέσεις ;)

Δημοσ.
Δεν καταλαβαίνω τι θέλεις να κάνεις με αυτόν τον κώδικα, από ότι βλέπω δημιουργείς 7 δείκτες και οι 7 να δείχνουν σε ένα sting που είναι το "hello\n".

Γενικά αυτός ο κώδικας είναι άκυρος γιατί δεν κάνει τίποτα, μήπως θέλεις να δημιουργήσεις ένα πίνακα από strings και μέσα στην for() loop να τους δίνεις τιμή?

Γιατί βλέπω ότι κάτι τέτοιο προσπαθείς να κάνεις.

Στην εργασία που κάνω συνάντησα συνάντησα προβλήματα στη χρήση της malloc, και γι'αυτό έφτιαξα αυτό το προγραμματάκι για να σας περιγράψω το πρόβλημα, χωρίς να χρειάζεται να σας "κουράζω" με την εργασία μου.

 

 

Επίσης όταν θέλεις καθαρά πχ 20 χαρακτήρες τότε ναι ορίζεις:

 

#define SIZE 20

 

αλλά στην malloc ή calloc δεσμεύεις SIZE+1 γιατί ο +1 πρόσθετος θα φυλάξει το '\0' που είναι και ο τελικός χαρακτήρας στο string σου, άρα σου μένουν καθαροί 20 χαρακτήρες.

Αυτό με το SIZE + 1 το έμαθα με τον "δύσκολο" τρόπο, δηλαδή κάνοντας απανωτά λάθη (runtime errors), αλλά το έμαθα το μάθημα μου τελικά.

 

Για ότι άλλο θέλεις και πιο συγκεκριμένο πες μου.

Θα επανέλθω, ευχαριστώ για την καλή διάθεση.

Δημοσ.
Καλησπέρα και καλώς σας βρίσκω,

μαθητευόμενος στη C, προσπαθώ να μάθω να χρησιμοποιώ σωστά την malloc, και όλο και κάποιο πρόβλημα ανακύπτει.

 

Εγραψα το παρακάτω πρόγραμμα, το οποίο χρησιμοποιεί ένα πίνακα δεικτών σε χαρακτήρες, και τυπώνει τα περιεχόμενα. Οπως φαίνεται απο την τιμή του SIZE, ο πίνακας έχει 7 θέσεις. Το πρόγραμμα λειτουργεί όπως ακριβώς περίμενα να λειτουργήσει, δηλαδή λειτουργεί σωστά.

 

>
#include <stdio.h>
#include <stdlib.h>    // malloc
#define SIZE 7

int main ( void )
{
     int i;
     char *array[ SIZE ];
     char *ptr;
     for ( i = 0; i < SIZE; i++ )
    {
         ptr = malloc ( 30 * sizeof( char ) );
         ptr = "hello\n";
         array[ i ] = ptr;
         printf( "array[ %d ] = %s\n", i, array[ i ] );
         
    }
    return 0;
} 

 

Τα περίεργα αρχίζουν όταν στο βρόχο for, αντικαταστήσω το i < SIZE με i < SIZE + 1

Το αποτέλεσμα εκτελείται κανονικά (!!!!) στον compiler που χρησιμοποιώ ( lcc win-32). Το πρόγραμμα, τώρα, τυπώνει 8 στοιχεία του πίνακα!!!

 

Να σημειώσω πως έχω ορίσει το warning level στο ανώτατο επίπεδο.

 

Και όταν γράψω i < SIZE + 2, τότε μόνο βγάζει runtime exception.

Η απορία μου είναι γιατί δεν βγάζει σφάλμα και στην περίπτωση i < SIZE + 1;

 

Ας σχολιάσουμε πρώτα αυτό, και στη συνέχεια έχω ακόμη πιο "φοβερά" μυστήρια! (σας δίνω μια 1η γεύση, παρατηρήστε οτι δεν αποδεσμεύω καθόλου μνήμη- με τη free(ptr) )

 

Το ότι κατάφερες να διαβάσεις πέρα από το πραγματικό μέγεθος του μπλοκ μνήμης που δέσμευσες με την malloc προέρχεται από το γεγονός πως η C δεν εφαρμόζει boundary έλεγχο κατά την προσπέλαση μνήμης οπότε τέτοιου είδους σφάλματα (boundary overflow) δυστυχώς είναι συνηθισμένα.

 

Ο εντοπισμός τους συνήθως είναι δύσκολος, ειδικά σε πολύπλοκους κώδικες μεγάλων σε μέγεθος προγραμμάτων, για αυτό έχουν αναπτυχθεί ειδικά λογισμικά που ανιχνεύουν αυτά τα λάθει όπως επίσης και αρκετά άλλα προβλήματα στην σωστή διαχείριση της μνήμης του προγράμματος.

 

Τώρα, όταν προκύπτουν τέτοια σφάλματα, το πρόγραμμα άλλοτε συνεχίζει να δουλεύει (ενδεχομένως με απρόβλεπτο τρόπο) άλλοτε σταματά (σπάει) μετά από κάποιο χρονικό διάστημα -γενικά το πότε & πως θα σκάσει, εξαρτάται, από το λειτουργικό σύστημα που το διαχειρίζεται, τον compiler που το δημιούργησε, αλλά και τι κάνει, και που, ο offending κώδικας μας -πρόκειται πάντως για σοβαρότατο bug που οφείλουμε να διορθώσουμε, διότι το πρόγραμμα παύει να είναι αξιόπιστο περιμένοντας απλά κάποια στιγμή "να τιναχθεί στον αέρα" ;).

 

...

 

Το παρακάτω πρόγραμμα, γραμμένο σε CodeGear/Borland C/C++ Builder 6.0 δημιουργεί έναν πίνακα των 10 chars, θέτει αυτές τις δεσμευμένες θέσεις στην τιμή 2 και ύστερα αρχίζει να εκτυπώνει στην οθόνη 30 αντί για 10 chars δημιουργώντας ένα τεχνητό boundary-error..

 

>
/*-Breaking Boundaries (bad C array use example) (c) Directx-----------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma hdrstop

/*---------------------------------------------------------------------------*/

#pragma argsused
int main(int argc, char* argv[])
{
   /* We allocate an array of 10 items */
   char *pszBuffer = (char*)malloc(10);
   if(pszBuffer!=NULL)
    {
       int nBadC;

       /* We set array items to value 2. */
       memset(pszBuffer,2,10*sizeof(char));
       /* We traverse the array outside of it's limits (**BAD**BAD**BAD**) */
       for(nBadC=0;nBadC<30;nBadC++)
           printf("[%.2d] (%p) = %X\n",nBadC,&pszBuffer[nBadC],pszBuffer[nBadC]);
       /* If we reach here, free local resources */
       free(pszBuffer);
    }
   else
       printf(" Malloc failure!\n");

   /* If you are lucky you could reach here! */
   printf(" Press Enter to quit..");
   getchar();
   return 0;
}
/*---------------------------------------------------------------------------*/

 

Καλή συνέχεια.

 

Υ.Γ.

Αν θέλετε να πιάσετε κατευθείαν το λάθος – ενεργοποιήστε τον ενσωματωμένο εκλεκτή μνήμης που προσφέρει ο C/C++ Builder (CodeGuard) και δείτε τι θα σας πει..

Δημοσ.

Μία συμπλήρωση σε μία λεπτομέρεια που γράφηκε πιο πάνω:

 

Αυτό συμβαίνει επειδή η C ξεκινάει να μετράει από το 0. Δηλαδή όταν ορίζεις έναν πίνακα array[10] ναι μεν έχει 10 θέσεις (ξεκινάει από το 0) αλλά η τελευταία του θέση είναι το array[9] και όχι το array[10]. Έτσι λοιπόν όταν βάζεις SIZE + 1, το i κάποια στιγμή γίνεται 10 και πηγαίνει στην θέση array[10] η οποία δεν περιέχει σωστά δεδομένα αλλά τυχαία δεδομένα της μνήμης (έχω την εντύπωση ότι κρατάει κάτι σαν το \0 που κρατάει ένας char πίνακας στην τελευταία του θέση, αλλά δεν είμαι καθόλου σίγουρος για αυτό).

 

Αν θέλουμε αλφαριθμητικά μέγιστου μήκους n χαρακτήρων τα οποία να δουλεύουν σωστά με τις συναρτήσεις της string.h, χρειαζόμαστε πίνακα n+1 θέσεων. Ο χαρακτήρας τερματισμού \0 τοποθετείται κανονικά εντός έγκυρης θέσης του πίνακα και φυσικά όχι μετά από αυτόν...

Δημοσ.

>
#include <stdio.h>
#include <stdlib.h>    // malloc
#define SIZE 7

int main ( void )
{
     int i;
     char *array[ SIZE ];
     char *ptr;
     for ( i = 0; i < SIZE; i++ )
    {
         ptr = malloc ( 30 * sizeof( char ) );
         ptr = "hello\n";
         array[ i ] = ptr;
         printf( "array[ %d ] = %s\n", i, array[ i ] );
         
    }
    return 0;
} 

 

Mia parathrhsh:

 

H grammh ptr = "hello\n"; shmainei pws to ptr 8a deixnei panta sto "hello\n" pou einai static allocated opote den xreiazete na desmeuseis mnhmh giauto. 8a mporouses diaforetika na grapseis anti gia ptr = "hello\n"; to ekshs: ptr = strncpy(ptr, "hello\n", 6);

 

Genika sthn C to construct ... = "string"; to xrhsimopoieis mono gia variable initialization. Px:

 

>
1) char str1[] = "string";
2) char str2[6] = "string";
3) char *str3 = "string";
4) char *str_array[] = { "string1", "string2", "string3" };
5) char str2_array[][] = { "string1", "string2", "string3" };

 

PROSOXH: Sthn 3h periptwsh (kai 4h) DEN mporeis na allakseis ta periexomena tou str3 (undefined behavior) ka8ws h mnhmh sthn opoia grafete to "string" einai sunh8ws read-only.

 

http://c-faq.com/decl/strlitinit.html

 

strncpy prototype:

---------------------

 

#include <string.h>

 

char *strncpy(char *s1, const char *s2, size_t n);

Δημοσ.

@DiAvOl:

Ευτυχώς πάντως, που η C προσφέρει την const οπότε μπορούμε να ορίσουμε τα char της 3 & 4 περίπτωσης ως τέτοια όπως ορθά προτείνει το faq ώστε να αποφύγουμε εκ παραδρομής assignments με αυτά.

Δημοσ.
>
#include <stdio.h>
#include <stdlib.h>    // malloc
#define SIZE 7

int main ( void )
{
     int i;
     char *array[ SIZE ];
     char *ptr;
     for ( i = 0; i < SIZE; i++ )
    {
         ptr = malloc ( 30 * sizeof( char ) );
         ptr = "hello\n";
         array[ i ] = ptr;
         printf( "array[ %d ] = %s\n", i, array[ i ] );
         
    }
    return 0;
} 

 

Mia parathrhsh:

 

H grammh ptr = "hello\n"; shmainei pws to ptr 8a deixnei panta sto "hello\n" pou einai static allocated opote den xreiazete na desmeuseis mnhmh giauto. 8a mporouses diaforetika na grapseis anti gia ptr = "hello\n"; to ekshs: ptr = strncpy(ptr, "hello\n", 6);

 

Genika sthn C to construct ... = "string"; to xrhsimopoieis mono gia variable initialization. Px:

 

>
1) char str1[] = "string";
2) char str2[6] = "string";
3) char *str3 = "string";
4) char *str_array[] = { "string1", "string2", "string3" };
5) char str2_array[][] = { "string1", "string2", "string3" };

 

PROSOXH: Sthn 3h periptwsh (kai 4h) DEN mporeis na allakseis ta periexomena tou str3 (undefined behavior) ka8ws h mnhmh sthn opoia grafete to "string" einai sunh8ws read-only.

 

http://c-faq.com/decl/strlitinit.html

 

strncpy prototype:

---------------------

 

#include <string.h>

 

char *strncpy(char *s1, const char *s2, size_t n);

 

Σωστά τα λες αλλά για το 5) δεν μπορείς να το κάνεις στην C καθώς ο compiler μπορεί μεν να βρίσκει το πόσα strings θα έχεις μέσα στον πίνακα από strings αλλά πρέπει να ξέρει την τελική διάσταση δηλαδή:

 

char array_of_strings[][32] = {"string1", "string2", "string3",....,};

Δημοσ.

 

Mia parathrhsh:

 

H grammh ptr = "hello\n"; shmainei pws to ptr 8a deixnei panta sto "hello\n" pou einai static allocated opote den xreiazete na desmeuseis mnhmh giauto. 8a mporouses diaforetika na grapseis anti gia ptr = "hello\n"; to ekshs: ptr = strncpy(ptr, "hello\n", 6);

 

Πολύ καλή κουβέντα γίνεται εδώ. DiAvOl το πέτυχες.

Στην πραγματικότητα ασχολούμαι με την strcpy. Ο κώδικας που έφερα ως παράδειγμα στο 1ο post ήταν "άστοχος" τελικά.

 

Ορίστε κάτι που μοιάζει περισσότερο με αυτό που ασχολούμαι.

>#include <stdio.h>    // input-output
#include <stdlib.h>   // malloc
#include <string.h>   // strcpy

#define ROW 7
#define COL 30

void function ( char *a[ ], char b[ ] );

int main ( void )
{
char *string_array[ ROW ];
char one_string[ COL ];

function ( string_array, one_string );

printf ( "string_array[ 0 ] is %s\n", string_array[ 0 ] );

return 0;
}

void function ( char *string_array[ ], char one_string[ ] )
{
char *ptr = NULL;
int len;

one_string = "hello";
len = strlen( one_string );
ptr = malloc ( ( len + 1 ) * sizeof ( char ) );
string_array[ 0 ] = strcpy ( ptr, one_string );
}

Το πρόγραμμα αυτό λειτουργεί σωστά, τυπώνει δηλαδή στην οθόνη το "hello".

2 απορίες

1) αν αντικαταστήσω τη γραμμή

>one_string = "hello";

με τη γραμμή

>one_string[ ] = "hello";

τότε βγάζει μύνημα λάθους

 

2)Τελικά πόσα bytes μνήμης πρέπει να δεσμεύσω για τον ptr;

αν αντικαταστήσω τη γραμμή

>ptr = malloc ( ( len + 1 ) * sizeof ( char ) );

με την γραμμή

>ptr = malloc ( sizeof ( char ) );

το πρόγραμμα εκτελείται κανονικά, και αυτό μου φαίνεται περίεργο

 

Υ.Γ Στο project με το οποίο ασχολούμαι το one_string αρχικοποιείται 7 φορές με διαφορετικού μήκους strings κάθε φορά, από μια αναδρομική συνάρτηση. Τα 7 strings αποθηκεύονται στον string_array. Να συμπληρώσω οτι συνάντησα περισσότερα προβλήματα από αυτα που σας περιγράφω, αλλά ΟΛΑ λύθηκαν αυτομάτως, μόλις δήλωσα τα string_array και one_string σαν global μεταβλητές πριν από την main. Απλά τώρα μου έχει μείνει η απορία και η περιέργεια.

Δημοσ.

Μάλλον δεν είδες ή διαβασες καθόλου αυτά που σου έγραψε ο insomniac DirectX. Σου ξαναεξηγώ ότι μπορεί μεν να δουλεύει αλλά γράφει στην μνήμη όπου να ναι και σίγουρα κάποια στιγμή θα κρασάρει. Είναι θέμα τύχης να την βγάλεις καθαρή. Κοίτα τον κώδικα μου είναι η δική μου συνάρτηση για να γράφεις σε ένα πίνακα από strings σε όποιο σημείο θέλεις. Χρησιμοποιήσε την σε μία επαναληπτική διαδικασία σε ένα for πχ για να φορτώσεις στον πίνακα σου όλα τα strings που σε νοιάζουν.

 

>
#include <stdio.h>    // input-output
#include <stdlib.h>   // malloc
#include <string.h>   // strcpy

#define ROW 7
#define COL 30

void function ( char *a[ ], char b[ ] );
void my_strcpy(char *ptrToStringArray[], char *ptrToAString, int Idx, char **delString);

int main (int argc, char **argv)
{
int i;
char *string_array[ ROW ];
/* String to give a value, use fgets if you like. */
char one_string[ COL ];
/* Pointer to hold the deleted string if any. */
char *delStr = NULL;
for(i = 0; i < ROW; i++)
	string_array[i] = calloc(COL,sizeof(char));

my_strcpy(string_array, "Hello", 0, &delStr);

/*function ( string_array, one_string );*/

printf ( "string_array[ 0 ] is '%s'\n", string_array[ 0 ] );

my_strcpy(string_array, "GoodBye", 0, &delStr);

printf ( "string_array[ 0 ] is '%s' and the deleted string was: '%s'\n", string_array[ 0 ], delStr);
return 0;
}

void function ( char *string_array[ ], char one_string[ ] )
{
char *ptr = NULL;
int len;

one_string = "hello";
len = strlen( one_string );
ptr = malloc ( ( len + 1 ) * sizeof ( char ) );
string_array[ 0 ] = strcpy ( ptr, one_string );
}

void my_strcpy(char *ptrToStringArray[], char *ptrToAString, int Idx, char **delString)
{
if(ptrToStringArray)
{
	if(ptrToAString)
	{
		if(ptrToStringArray[idx])
		{
			if(!strcmp(ptrToStringArray[idx],""))
			{
				strcpy(ptrToStringArray[idx],ptrToAString);
				return;
			}
			else
			{				
					/* Save the removed string. */
					char *delStr = strdup(ptrToStringArray[idx]);
					*delString = delStr;

					/* Clear the string from it's contents. */
					memset(ptrToStringArray[idx],0, strlen(ptrToStringArray[idx]));
					/* Save the the string to the array. */
					strcpy(ptrToStringArray[idx], ptrToAString);
					return;
			}	
		}
		else
		{
			printf("NULL.\n");
			return;
		}
	}
	else
	{
		printf("NULL.\n");
		return;
	}
}
else
{
	printf("NULL.\n");
	return;
}
}

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

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

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