2012-03-25 4 views
0
#include <stdio.h> 

int main(int argc, char *argv[]) { 
    long* fp; 
    while(1) 
    { 
     fp = (long*) malloc (sizeof(long)); 
     printf("%d\t",fp); 
    } 
} 

ich das lief Ich Ergebnis wie bekommen:?.?Ist „long: 16Byte auf meinem System

1193392 1193408 1193424 1193440 1193456 1193472 1193488 1193504 1193520 1193536 1193552 1193568 1193584 1193600 1193616 1193632 1193648 1193664 1193680 1193696 1193712 1193728 1193744 1193760 1193776 1193792 1193808 1193824 1193840 1193856 1193872 1193888 1193904 1193920 1193936 1193952 1193968 1193984 1194000 1194016 1194032 1194048 1194064 1194080 1194096 

Bedeutet dies lange auf meinem System 16 Byte lang ist

Dank .

ich habe gerade bemerkt, dass .. von Anfang an Teil. die Differenz 14 ist, dann beomes es bis 16. bizarr.

Antwort

4

Nicht unbedingt. Es könnte anzeigen, dass die Granularität des Zuordners 16 Byte ist.

4

Nein, tut es nicht. Es bedeutet nur, dass malloc() 16-Byte ausgerichtete Blöcke zurückgibt.

Auch sollten Sie keine Zeiger mit %d drucken, sollten Sie %p verwenden, um Zeiger zu drucken.

Um herauszufinden, wie groß ein long ist,

printf("%zu\n",sizeof(long)); 
0

diesen Code Versuchen:

int main(int argc, char *argv[]) { 
    printf("%ld", sizeof(long)); 
} 
+1

Falscher Typ ist. '% zu', nicht'% ld', ist für 'size_t'. Oder vor dem Drucken auf einen bekannten Typ wie "unsigned long" umwandeln. –

3

Was weist sizeof(long) konkret? Ich wäre überrascht, wenn es 16 Bytes ist.

Hinweis von malloc(3):

RETURN VALUE 
    For calloc() and malloc(), return a pointer to the allocated 
    memory, which is suitably aligned for any kind of variable. 

Ihre Plattform erfordert offenbar 16-Byte-Ausrichtung für einige Objekte, so dass die Granularität von malloc(3) zurückgegeben wird.

2

Zuerst rufen Sie printf falsch auf; %d ruft ein Argument des Typs int auf, und das Übergeben von etwas anderem (wie long *) ruft undefiniertes Verhalten auf. Mit anderen Worten, Sie können daraus keine wirklichen Schlüsse ziehen.

Stattdessen tun:

printf("%p\n", (void*)fp); 

Oder auch einfach fragen, was Sie wollen direkt:

printf("%d\n", (int)sizeof(long)); 

Beachten Sie auch, dass die meisten Systeme haben einige zusätzliche Overhead über die Größe des Objekts malloc angefordert. Unter Linux glibc muss jedes malloc mindestens 2*sizeof(void*) Bytes plus zusätzliche 2*sizeof(void*) Bytes Overhead zuweisen, die über die Anforderungen hinausgehen (dies ist die aktuelle Implementierung; dies ist jedoch undokumentiert und kann ohne vorherige Ankündigung geändert werden). Wenn Ihre void* 4 Bytes lang sind, passt dies gut zu Ihren Beobachtungen.

0

No. Vielmehr malloc() wird durch den Standard erforderlich, um eine Adresse zurückzugeben, die in geeigneter Weise für jeden Datentyp ausgerichtet ist, so dass man nur beobachten, daß die maximale Ausrichtung auf der Plattform 16

Verwandte Themen