Malloc() probleem.

Status
Niet open voor verdere reacties.

Jori13

Gebruiker
Lid geworden
18 jan 2010
Berichten
159
Hallo,

Voor een opgave uit een boek moet ik een soort database voor CD's maken, daarbij heb ik de volgende code geschreven:

[CPP]#include "taak4_O2.h"


void addCD(cd **, cd, int*);
void printCD(cd **);

int main(void)
{
int i;
int cur_cd = 0;

cd new_cd;
cd **cd_lijst;

cd_lijst = (cd**) malloc(100 * sizeof(cd*));
for(i = 0 ; i < 100 ; ++i) cd_lijst = (cd*) malloc(sizeof(cd));



/* De CD */
new_cd.titel = "Thiller";
new_cd.artiest = "Michael Jackson";
new_cd.speelduur = 500;

/* CD toevoegen */
addCD(cd_lijst, new_cd, &cur_cd);

/* Printen */
printCD(cd_lijst);


free(cd_lijst);

return 0;
}



/* CD toevoegen */
void addCD(cd **cd_lijst, cd new_cd, int *cur_cd)
{
cd_lijst[*cur_cd]->titel = new_cd.titel;
cd_lijst[*cur_cd]->artiest = new_cd.artiest;
cd_lijst[*cur_cd]->speelduur = new_cd.speelduur;

(*cur_cd)++;
}



void printCD(cd **cd_lijst)
{
int i = 0;

while (cd_lijst->titel != NULL)
{
printf("%s\n", cd_lijst->titel);
printf("%s\n", cd_lijst->artiest);
printf("%d\n\n", cd_lijst->speelduur);

++i;
}

}[/CPP]

De inhoud van de header file is:


[CPP]#include <stdio.h>
#include <stdlib.h>

typedef struct
{
char* titel;
char* artiest;
int speelduur; /* In sec */

} cd ;[/CPP]

De output is dit:

Code:
Thiller
Michael Jackson
500


↑Úi
1128091725


↑Úi
1635017028


↑Úi
1936876915


↑Úi
1550606691


↑Úi
6910575


↑Úi
7497067


↑Úi
1919904348

Dat duid erop dat ik iets niet goed heb gedaan met malloc(), maar wat? :)

Alvast bedankt voor jullie hulp,
Jori.
 
Laatst bewerkt:
De uitvoer klopt toch? Je maakt 100 cd's aan en vult van maar een cd de inhoud in. De rest krijgt dus (standaard) een willekeurige waarde (of eigenlijk de waarde die al toevallig op die geheugenpositie stond), niet NULL wat je misschien zou verwachten.
 
Laatst bewerkt:
Oké :P. Hoe kan ik er dan voor zorgen dat alleen de door mij ingevoerde waarden op het scherm verschijnen?

Bovendien loopt hij vast na deze waarden te hebben afgedrukt, dus er klopt toch echt iets niet.
 
Kijk eens naar de functie "printCD":
[cpp]while (cd_lijst->titel != NULL)[/cpp]
Zo lang cd_lijst->titel ongelijk is aan NULL print het programma de cd-informatie. Dat is waarschijnlijk ook de reden dat je programma vastloopt. Hij stopt pas als cd_lijst->titel NULL is en als alles een willekeurige waarde heeft komt hij die niet tegen en komt uiteindelijk (na 100 cd's) buiten de array en crasht.

Om ervoor te zorgen dat alleen de ingevulde cd's worden getoond moet je er dus voor zorgen dat alle cd-titels initieel op NULL worden gezet. Normaal gesproken zou je dat doen via de constructor van de struct, maar in dit geval is dat wat lastiger vanwege de typedef. Het makkelijkste is waarschijnlijk om na het "mallocen" met een for-lus alle titels op NULL te zetten (evt. kan je hiervoor de nu al bestaande for-lus "misbruiken" en na de malloc regel de titel van de desbetreffende cd op NULL zetten).

Overigens moet je in "printCD" sowieso een bovengrens maken. Als de array helemaal gevuld is (in dit geval 100 cd's) gaat die functie buiten de array (hij stopt immers pas als een titel NULL is) en zal het programma weer crashen.

[edit]Blijkbaar zijn er ook compilers die waarden wel initieel op NULL zetten. Bij mij werkt je programma wel goed.[/edit]
 
Laatst bewerkt:
[edit]Blijkbaar zijn er ook compilers die waarden wel initieel op NULL zetten. Bij mij werkt je programma wel goed.[/edit]

Ja klopt. Daarom schreef ik oorspronkelijk die code op die manier :P.


Ik gebruik de cl.exe van Visual Studio 2010. Ik neem aan dat jij GCC hebt gebruikt?
 
Nee :P. Maar ik wist dat GCC malloc() waardes op NULL zet. Mijn leerboek is op GCC gebaseerd, daarom deed ik het in eerste instantie fout.


Jori.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan