[C] Ik zie de fout niet

Pagina: 1
Acties:

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Ik heb de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void ToonInvoer(char **ppc, int totaal);

void main()
{
char **ppc, *pc, woord[100];
int teller = 0;
ppc = (char**) malloc(sizeof(pc));
printf("Geef een aantal woorden, stop = stoppen\n");
printf("Geef een woord : ");
scanf("%s", woord);

while(strcmp(woord,"stop")!=0)
{
//Zolang ingevoerde woord geen "stop" is:

//dynamisch geheugen toewijzen aan pc
//lengte woord + stringafsluiter
pc = (char*) malloc(strlen(woord)+1);
//kopieren van woord naar pc
strcpy(pc,woord);
//grootte van geheugen benodigd voor pcc gelijk aan ...
ppc = (char**) realloc(ppc, sizeof(ppc)+sizeof(pc));
//pcc naar pc laten wijzen
ppc[teller] = pc;
printf("Geef nog een woord : ");
scanf("%s",woord);
teller++;
}
printf("\nAantal ingevoerde woorden : %d\n",teller);
printf("Ingevoerde woorden: ");
ToonInvoer(ppc,teller);
}

void ToonInvoer(char** ppc,int totaal)
{
int i;
for(i=0;i<totaal;i++)
{
printf("Woord %d : %s\n",i, *ppc);
ppc++;
}
}

Een gebruiker wordt net zolang om strings gevraagd totdat hij stop invoert. Het ingevoerde woord wordt in woord opgeslagen. Vervolgens wordt er geheugen gereserveerd ter grootte van het woord en wordt de string in woord gekopieerd naar de character pointer pc. ppc wordt gebruikt voor de opslag van de adressen van de beginletters van iedere string.

Wat gaat er goed:
Opslag.

Wat gaat er mis:
Het weer terugzetten op het scherm van de ingevoerde woorden. Gaat alleen goed bij een aantal van 3 of minder. Wat gaat er hier mis?? Ligt het aan realloc???

Verwijderd

Kan je die code ff goed formatten?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op dinsdag 26 februari 2002 14:50 schreef XKB het volgende:
Kan je die code ff goed formatten?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string.h>
#include <malloc.h>

void ToonInvoer(char **ppc, int totaal);

void main()
{
    char **ppc, *pc, woord[100];
    int teller = 0;
    ppc = (char**) malloc(sizeof(pc));
    printf("Geef een aantal woorden, stop = stoppen\n");
    printf("Geef een woord : ");
    scanf("%s", woord);
    
    while(strcmp(woord,"stop")!=0)
    {
        //Zolang ingevoerde woord geen "stop" is:
        
        //dynamisch geheugen toewijzen aan pc
        //lengte woord + stringafsluiter
        pc = (char*) malloc(strlen(woord)+1);
        //kopieren van woord naar pc
        strcpy(pc,woord);
        //grootte van geheugen benodigd voor pcc gelijk aan ...
        ppc = (char**) realloc(ppc, sizeof(ppc)+sizeof(pc));
        //pcc naar pc laten wijzen
        ppc[teller] = pc;
        printf("Geef nog een woord : ");
        scanf("%s",woord);
        teller++;
    }
    printf("\nAantal ingevoerde woorden : %d\n",teller);
    printf("Ingevoerde woorden: ");
    ToonInvoer(ppc,teller);
}

void ToonInvoer(char** ppc,int totaal)
{
    int i;
    for(i=0;i<totaal;i++)
    {
        printf("Woord %d : %s\n",i, *ppc);
        ppc++;
    }
}

graag gedaan :)

Doet iets met Cloud (MS/IBM)


Verwijderd

ik denk dat het idd aan de realloc ligt. Als ik me niet vergis geef je daardoor het geheugen waarin je een eerder woord had opgeslagen weer vrij.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

code:
1
2
3
4
5
ppc = (char**) malloc(sizeof(pc));

...

ppc = (char**) realloc(ppc, sizeof(ppc)+sizeof(pc));

dat gaat niet werken :)

sizeof (pc) = sizeof (char * ) (want pc is een char * ), en dat is gelijk aan 4 (een pointer is 4 bytes)
sizeof (ppc) is ook 4, aangezien ppc ook een pointer is (naar een pointer naar char). Met sizeof kun je dus niet de grootte van de gereserveerde array opvragen. Dat is ook logisch als je bedenkt dat ppc eigenlijk helemaal geen array is, het is een pointer naar het 1e element van de array.

Je zult dus het aantal woorden bij moeten houden, en dan voor ppc een geheugenblok reserveren van aantal_woorden * sizeof (char * ) bytes

.edit: hmmm ja idd best wel gaar, dat * en ) een *D wordt :)

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.


  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Gelukkig dat het aan de realloc lag. Vermoedde ik het i.i.g. goed.
Op dinsdag 26 februari 2002 15:10 schreef OiSyN het volgende:
code:
1
2
3
4
5
ppc = (char**) malloc(sizeof(pc));

...

ppc = (char**) realloc(ppc, sizeof(ppc)+sizeof(pc));

dat gaat niet werken :)

sizeof (pc) = sizeof (char *D (want pc is een char *D, en dat is gelijk aan 4 (een pointer is 4 bytes)
sizeof (ppc) is ook 4, aangezien ppc ook een pointer is (naar een pointer naar char). Met sizeof kun je dus niet de grootte van de gereserveerde array opvragen. Dat is ook logisch als je bedenkt dat ppc eigenlijk helemaal geen array is, het is een pointer naar het 1e element van de array.

Je zult dus het aantal woorden bij moeten houden, en dan voor ppc een geheugenblok reserveren van aantal_woorden * sizeof (char *D bytes
Duidelijk

Bedankt allemaal!

(Leuk effect trouwens die * ) == *D )
Blijkt trouwens uit dat een *D zowel met * ) als * D gemaakt kan worden.

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
Getest en het werkt goed :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh overigens, er is ook een functie strdup, die je string dupliceert en dus automatisch een nieuw stuk geheugen aanroept...

oftewel, dit:
code:
1
2
char * str2 = (char *) malloc (sizeof (str) + 1);
strcpy (str2, str);

kan geschreven worden als
code:
1
char * str2 = strdup (str);

:)

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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-09 23:01
en verderop in je code
code:
1
free(str2);

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