char *tab[200] jak to zwrócić ??
Ostatnio zmodyfikowano 2014-11-16 15:57
Tomek_z_W11 |
» 2014-11-14 18:04:32 @Kaikso, na jakim stosie? Co nadpisuje? tab i tab2 się same dealokują po wyjściu z funkcji - to są tablice statyczne, funkcja func() jest wywoływana raz, więc nic sie nie nadpsuje, coś nawymyślałeś... |
|
stryku |
» 2014-11-14 18:21:51 @Tomek_z_W11 Co nadpisuje? Alokujesz pamięć ret[ i ] =( char * ) malloc( sizeof( char ) * 50 );
A potem robisz ret[ 0 ] = tab; Więc tracisz wskaźnik na wcześniej zaalokowaną pamięć i w RAMie jest sobie gdzieś 50 niczyich bajtów. Nie dasz rady ich zwolnić. |
|
Kaikso |
» 2014-11-15 16:01:54 Jeśli dobrze zrozumiałem to powinno działać tak jak chcesz ;). A więc u ciebie ilość elementów i tak jest ograniczona ( char * ret[ K ] ), więc najlepiej zrób to tak, w taki sposób dodatkowo zabezpieczysz przed przepełnieniem bufora w ilości elementów i ich długości. #include <stdio.h> #include <string.h> #include <malloc.h>
size_t cutstr( const char * str, char ** buffer, size_t max_cuts, size_t max_cutlen ) { size_t len = strlen( str ); size_t i, j, cuts; for( i = 0, j = 0, cuts = 0; i < len && cuts < max_cuts; i++ ) { if( str[ i ] == ' ' ) { if( j > 0 ) { buffer[ cuts++ ][ j ] = '\0'; j = 0; } continue; } else if( j >= max_cutlen ) continue; buffer[ cuts ][ j++ ] = str[ i ]; } printf( "cuts: %u\n", cuts ); for( i = 0; i < cuts; i++ ) printf( "cut[%u] = \"%s\"\n", i, buffer[ i ] ); return cuts; }
#define MAX_CUTS 512 #define MAX_SIZE 512
int main( void ) { size_t i; char ** cut =( char ** ) malloc( sizeof( char * ) * MAX_CUTS ); for( i = 0; i < MAX_CUTS; i++ ) cut[ i ] =( char * ) malloc( MAX_SIZE ); char str[] = " cut0 cut1 cut2 cut3 cut4 cut5 "; size_t cuts = cutstr( str, cut, MAX_CUTS, MAX_SIZE ); printf( "cuts: %u\n", cuts ); for( i = 0; i < cuts; i++ ) printf( "cut[%u] = \"%s\"\n", i, cut[ i ] ); for( i = 0; i < cuts; i++ ) free( cut[ i ] ); free( cut ); return 0; }
@Tomek_z_W11 jeśli nie wiesz co to i jak działa stos, czy twierdzisz że wszystko samo się dealokuje (to nie Java, skoro w C++ wymagane jest użycie operatora delete to tym bardziej w C należy użyć funkcji free) lub zakładasz że ktoś użyje tej funkcji tylko raz to po co ty w ogóle zabierasz głos. |
|
Tomek_z_W11 |
» 2014-11-16 15:57:26 Bosz...
@Kaikso ...
@stryku Apropos nadpisywania, to masz racje, źle to zrozumiałem. Miałeś na myśli wyciek pamięci, tylko to inaczej ubrałeś w słowa. Zapomniałem dodać delete po prostu. Nadpisywanie mi się skojarzyło z czymś zupełnie innym. |
|
1 « 2 » |