Portál AbcLinuxu, 23. února 2026 05:04
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RADKY 5
#define DELKA 256
int main(void) {
char **text;
int i;
/* Alokace pole. */
text=(char **) malloc(RADKY*sizeof(char *));
for (i=0; i<RADKY; i++)
text[i]=(char *) malloc(DELKA*sizeof(char));
/* Neco do nej dame. */
strcpy(text[0], "prvni");
strcpy(text[1], "druhy");
/* Zkusime to vytisknout. */
printf("%s", text[0]);
/* Uvolneni pole. */
for (i=0; i<RADKY; i++) free(text[i]);
free(text);
return(0);
}
Místo RADKY a DELKA můžeš mít libvolnou proměnnou typu int. Nezapomeň, že dvourozměrné pole musíš uvolňovat ve dvou krocích. Snad jsem to trefil, kdyžtak napiš mail.
typedef struct {
char *radek;
struct *radek;
} radek;
(ted si nejsem jisty syntaxi) a pak postupne pridavat prvky..
no a zpetne prochazeni taky bude horor...
cili jednoducha funkce v C na to neexistuje, moznosti jsou: naprogramovat si to sam, pouzit C++ (asi nejlepsi volba) nebo pouzit nejaky script jazyk
printf("Zadej pocet radku: ");
scanf("%d", &radky);
tak pak muj priklad funguje, staci misto RADKY napsat radky:
/* Alokace pole. */
text=(char **) malloc(radky*sizeof(char *));
for (i=0; i<radky; i++)
text[i]=(char *) malloc(DELKA*sizeof(char));
a je to jednodussi.
typedef struct {
char *retezec;
radek *dalsi;
radek *predchozi;
} radek;
Tohle resi docela dobre zpetne prochazeni a je to myslim dobre.
jinak me ale jste napadla jedna vec kterou pozuivam kdyz nejde o moc dat a hodi se s nima pracovat jako s polem (typicky zpracovani dat ve fortranu), pak lze pouzit pole tak,
ze se nejprve naplni 2 prvky, kdyz to nestaci tak se 2 prekkopiruji do 4 prvkoveho pole, kdyz ani
to ne, tak se prekopiruje 4 prvky a vytvori 16 atd... velmi sikovne a rychle, bohuzel trochu zrout pameti..
, ale v tomto pripade, kdy by se alokovalo jen 4byte pole ukazatelu na stringy je to urcite lepsi nez se drbat se zasobnikem
typedef struct {
char *retezec;
radek *dalsi;
radek *predchozi;
} radek;
by melo byt:
typedef struct s_radek {
char *retezec;
struct s_radek *dalsi;
struct s_radek *predchozi;
} radek;
Protoze radek neni tou dobou jeste deklarovan, ale struct s_radek jiz ano.
několik takových struktur je třeba v glib.
gcc umožňuje int foo(int n) { char *p[n]; ... }, ale standardní C bohužel ne.
Jinak je třeba použít malloc/alloca...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.