Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

char *tab[200] jak to zwrócić ??

Ostatnio zmodyfikowano 2014-11-16 15:57
Autor Wiadomość
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ś...
P-120597
stryku
» 2014-11-14 18:21:51
@Tomek_z_W11

Co nadpisuje?


Alokujesz pamięć
C/C++
ret[ i ] =( char * ) malloc( sizeof( char ) * 50 ); //alokacja kolumn, czyli ile liter ma mieć każdy wiersz.
 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ć.
P-120599
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.

C/C++
#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 // = K
#define MAX_SIZE    512 // = cutmaxlength

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.
P-120666
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.
P-120796
1 « 2 »
Poprzednia strona Strona 2 z 2