Malloc

Tags:    c++

<< < 12 > >>
Hej

Jeg er ved at lege lidt med malloc og er kommet frem til denne kode:
Fold kodeboks ind/udKode 

Denne kode mener jeg, skulle gerne skrive 100, med mindre der sker en fejl under allokering af hukommelse, eller er jeg helt galt på den?? Så hvor er det, det går galt for mig ??

.edit: Det skal lige tilføjes at den skriver 4



Indlæg senest redigeret d. 17.02.2007 14:36 af Bruger #3789
14 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Kommandoen malloc() bruges til at allokere hukommelse på heapen og er ikke nødvendig ved brug af int. Når hukommelsen allokeres sættes den ikke til nogen værdi. Du får blot stillet hukommelsen tilrådighed.

int main() {
int result = 100;
printf("%d", result);
return 0;
}

Grunden til at den udskriver "4" det skyldes at du beder den om at skrive størrelsen på din pointer ved brug af sizeof(int*), hvilket altid er 4 bytes.

Insisterer du på at bruge malloc ved int, så skal du efter du har allokeret hukommelsen, sætte den til til værdien. Når du sætter værdien, så skal du huske at dereferere din pointer ellers ændre du adressen pointeren peger på i stedet for at ændre de data den peger på. Jeg vil i øvrigt anbefale at du initialisere hukommelsen inden du bruger den og så er 100 bytes måske lige rigeligt for int. Brug i stedet sizeof(int),

int main(int argc, char* argv[])
{
int *result;
result = (int*)malloc(sizeof(int)+1);
memset(result, 0, sizeof(int)+1);
(*result) = 100; // Her sættes værdien!
if( result == NULL ) {
printf("Malloc Error");
}
printf("%d", *result);
free(result);
return 0;
}

HTH



Indlæg senest redigeret d. 17.02.2007 15:22 af Bruger #10448
I C++ (og C) kan man ikke ud fra en pointer alene vide hvor meget memory den peger på, eller om den overhovedet peger på noget, det er du nødt til at holde styr på selv. Hvis pointeren efter malloc ikke er NULL, virker malloc og du har fået det du bad om.

Husk også at malloc(100) giver dig 100 bytes, som normalt er nok til 25 int, da en int ofte fylder 4 byte.

Hvis du vil have plads til 100 int skal du bruge malloc(100*sizeof(int));



Ved brug af større tal er det generelt en god ide at bruge long så man slipper for overløb.

long * pLong = (long*)malloc(sizeof(long));

Man kan godt caste en int til en long, men skal passe meget på med at det gøre det den modsatte vej.

En long dækker tal indefor intervallerne:

1) signed
-2,147,483,648 -> 2,147,483,647
2) unsigned
0 -> 4,294,967,296

Hth



Indlæg senest redigeret d. 17.02.2007 23:48 af Bruger #10448
Jess: Grunden til at jeg allokere hukommelse til en int er at jeg skal gemme et tal som er noget større end hvad en unsigned int kan tage.

Grunden til at jeg udskriver sizeof(result) var i troen om at den ville udskrive størrelsen på det allokerede område, for at se om det virker som det skal





Bertel: Vil det sige at den pointer som jeg får fra malloc peger på et array ?



Jess: Grunden til at jeg allokere hukommelse til en int er at jeg skal gemme et tal som er noget større end hvad en unsigned int kan tage.

Grunden til at jeg udskriver sizeof(result) var i troen om at den ville udskrive størrelsen på det allokerede område, for at se om det virker som det skal



Hej Søren

Nej, den udskriver ikke størrelsen på det allokerede område, men størrelsen på din pointer (= 4 bytes). Se det sidste eksempel jeg skrev, der bruger jeg malloc til en int. Jeg har klippet det ind her nedenfor.

int main(int argc, char* argv[])
{
int *result;
result = (int*)malloc(sizeof(int)+1);
memset(result, 0, sizeof(int)+1);
(*result) = 100; // Her sættes værdien!
if( result == NULL ) {
printf("Malloc Error");
}
printf("%d", *result);
free(result);
return 0;
}



Indlæg senest redigeret d. 17.02.2007 17:02 af Bruger #10448
Jess: Det giver stadig problem med at, den overskrider grænsen, og det virker som om at det er samme sted at den standser.



Jess: Det giver stadig problem med at, den overskrider grænsen, og det virker som om at det er samme sted at den standser.


Hvad er det for en grænse den overskriver?




Jess: Grænsen for hvad en int kan indeholde



Det malloc returnerer virker på samme måde som et array, bortset fra at du ikke kan bruge sizeof til at finde størrelse.

Metoden med malloc gør ikke at du kan gemme større tal, blot at du kan gemme flere af dem.

Så hvis problemet er at du skal kunne gemme større tal end der er plads til i en int skal du finde en anden metode.

De fleste compilere kan bruge 64-bit heltal, f.eks:
Fold kodeboks ind/udKode 

Ovenstående virker med GCC (dev-cpp og code :: blocks), nogle compilere har ikke stdint.h, her kan man ofte bruge __int64 eller lignene.

I nogle tilfælde kan man også bruge double, men det er ikke heltal.

Ellers skal man ud og finde et bibliotek, f.eks:
https://sourceforge.net/projects/cpp-bigint/



<< < 12 > >>
t