Toon posts:

[c] string array

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik moet een array van strings maken, maar het gaat niet helemaal goed

Dit is mijn code:

char **arr;
arr [10];

arr [0] = "Test";

ff een vraagje, moet je persé malloc gebruiken? Ik heb het niet gebruikt en ik krijg een segmentation fault. Ik heb ff getest, en de fout ligt bij de laatste regel.

Alvast bedankt voor uw hulp...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

als je het zo doet moet je idd eerst de array alloceren, met malloc dus:
code:
1
2
char ** arr;
arr = malloc (10 * sizeof (char *));   /* alloceer een array van 10 elementen */

of je definieert m statisch:
code:
1
char * arr[10];   /* array van 10 elementen */

als je een array alloceert vergeet m dan niet vrij te geven met free ()

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ik ben gewoon een newbie, maakt alloceren veel verschil met statisch?

Er moeten trouwens in dat array strings komen die waarschijnlijk wel aardig wat kilobyte zijn, geeft dat geen problemen?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

verschil tussen statisch en dynamisch is dat je een dynamische array van grootte kunt laten veranderen (door een nieuwe array te alloceren en dan alle data naar de nieuwe te kopieren, en vervolgens de oude weer vrij te geven)

Maar dit is wel allemaal erg basic C... is het niet verstandiger om gewoon een boek of tutorial erover te lezen? Schiet je veel meer mee op dan hier steeds je vragen te stellen (wat bovendien ook niet de bedoeling van GoT is)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:59
Als je die array statisch alloceert, dan wordt hij op de stack geplaatst.
Doe je het dynamisch, dan wordt hij op de heap gezet.

Voordeel van dynamisch alloceren is, dat je at-runtime geheugen kunt alloceren. Je hoeft dus niet bij compilatie te weten hoe groot jouw array moet zijn.
Grote hoeveelheden geheugen worden ook meestal op de heap gealloceerd (dynamisch dus), omdat je anders stack overflow errors kunt krijgen.

Als je geheugen dynamisch alloceert, dan is de programmeur ook verantwoordelijk voor het nadien vrijgeven van dat geheugen.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 juni 2002 22:24 schreef whoami het volgende:
Als je die array statisch alloceert, dan wordt hij op de stack geplaatst.
behalve als de array globaal is, dan wordt ie natuurlijk niet op de stack gealloceerd ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

vergeet niet om vervolgens voor elk element ook weer geheugen te reserveren. Je reserveert met deze regel
code:
1
arr = malloc (10 * sizeof (char *));

enkel de array zelf, niet de elementen.

dus
code:
1
arr[ 0 ] = malloc ( 50 * sizeof ( char ) );

etcetera.
Dominique:
ik ben gewoon een newbie
ok. :D
maakt alloceren veel verschil met statisch?
't verschil is dat je tijdens je programma verloop geheugen kan reserveren, oftewel dynamisch geheugenbeheer.

Als je programma ten allen tijde evenveel geheugen nodig heeft, is het beter om het statisch te doen. Maar dat is zo sporadisch, dat het bijna altijd wel een goede keuze is om het dynamisch te doen.

ajbwib :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 juni 2002 22:27 schreef drm het volgende:
dus
code:
1
arr[ 0 ] = malloc ( 50 * sizeof ( char ) );
ik denk dat strdup () een beter alternatief is, mits je natuurlijk ook echt geheugen wilt alloceren

als je het gewoon naar statische data wilt laten wijzen dan kun je ze natuurlijk ook gewoon assignen:
code:
1
2
array[0] = "hallo";
array[1] = "daar";

maar dan is het beter om je array te definieren als const char ** ipv gewoon char **, aangezien statische strings niet veranderd mogen worden

.edit: oh en realloc :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op woensdag 12 juni 2002 22:27 schreef drm het volgende:
't verschil is dat je tijdens je programma verloop geheugen kan reserveren, oftewel dynamisch geheugenbeheer.
(zowel jij als .oisyn noemen de functie nog niet: realloc() )
Als je programma ten allen tijde evenveel geheugen nodig heeft, is het beter om het statisch te doen. Maar dat is zo sporadisch, dat het bijna altijd wel een goede keuze is om het dynamisch te doen.
Ben ik het niet mee eens - er zijn vele situaties dat statisch geheugenbeheer beter is. Het gebruik van malloc() wil je sowieso zo klein mogelijk houden imho. :Y). Bovendien is het weer vier byte extra aan een pointer. :+.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 juni 2002 22:52 schreef beelzebubu het volgende:

[..]

(zowel jij als .oisyn noemen de functie nog niet: realloc() )
welles :P <span style="font-size:6pt;">zie edit</span>

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Heb het al gevonden...bedankt. BTW het moet morgen af, dus een boek lezen zal niet gaan. Verwijt mij niet dat ik het eerder had moeten doen. Ik werk met iemand samen, diegene die snapte het niet helemaal, dus ik heb alleen maar nobel gehandelt en hem geholpen (en mezelf dus).

Maar in ieder geval bedankt voor jullie hulp (voor de zoveelste maal).

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

beelzebubu:
(zowel jij als .oisyn noemen de functie nog niet: realloc() )
Ik heb afgeleerd volledig te zijn in mijn posts O-) ;)
Ben ik het niet mee eens - er zijn vele situaties dat statisch geheugenbeheer beter is. Het gebruik van malloc() wil je sowieso zo klein mogelijk houden imho. :Y). Bovendien is het weer vier byte extra aan een pointer. :+.
mwjah... zit wat in. Ik denk (bij nader inzien :+) dat je per geval moet bekijken of het zin heeft dynamisch te reserveren.

tevreden? ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 12 juni 2002 23:28 schreef drm het volgende:

mwjah... zit wat in. Ik denk (bij nader inzien :+) dat je per geval moet bekijken of het zin heeft dynamisch te reserveren.
ik denk eerlijk gezegd dat dat best wel meevalt... zolang je het niet regelmatig hoeft te doen kun je best vaak malloc gebruiken (en met regelmatig bedoel ik bijvoorbeeld in een ingewikkelde berekening met veel iteraties ofzo)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
In mijn geval heeft het wel degelijk zin om het dynamisch te alloceren. In het array moeten mails komen te staan en het aantal mails is variabel en de grootte van de mail is ook variabel.

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Op woensdag 12 juni 2002 22:14 schreef Dominique het volgende:
Ik moet een array van strings maken, maar het gaat niet helemaal goed

Dit is mijn code:

char **arr;
arr [10];

arr [0] = "Test";
Van bovenstaande klopt errug weinig :)

Statische arrays :
code:
1
char arraytje[10][80];

Dynamische arrays :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char ** arraytje;
int i;

arraytje = (char **) calloc(10, 1);
for (i = 0; i < 10; i++)
    arraytje[i] = (char *) calloc(80,1);

strcpy(arraytje[0], "Testje");
strcpy(arraytje[1], "Blaat");

i = 0; 

while (arraytje[i][0]) {
   printf("arraytje[%d] : %s\n", i, arraytje[i]);
   i++;
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:52
Op woensdag 12 juni 2002 22:25 schreef .oisyn het volgende:

[..]

behalve als de array globaal is, dan wordt ie natuurlijk niet op de stack gealloceerd ;)
Of static ...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1