2016-07-22 4 views
-1

* Hinweis: Dies ist keine doppelte Frage, da die Antwort, auf die Sie verweisen, meine Frage nicht beantwortet. Ich weiß, was malloc() und calloc() tun sollten, aber wundere dich, warum es keinen Unterschied gibt, wenn du es mit Virtual Machine verwendest.Der Unterschied zwischen malloc() und calloc() in C (von Virtual Machine Linux) kann nicht gefunden werden

Ich weiß, was der Unterschied sein sollte - malloc() nur Sie den Speicher zuweisen, während Calloc() es mit Nullen initialisieren.

Die Sache ist, in meinem Code wird es nicht angezeigt, und Malloc() scheint keinen Unterschied zu geben, während von meiner Virtual Machine Ubuntu ausgeführt wird. Ich habe es ein paar Mal ausgeführt und malloc verhält sich genau wie Calloc.

Hinweis - Ich habe es gerade mit meiner tatsächlichen Festplatte überprüft, und es scheint zu funktionieren, da bekomme ich andere Ergebnisse.

Der Code:

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
int i,n; 
float *ptr1, *ptr2; 
printf("enter a total number of float items: "); 
scanf("%d", &n); 

ptr1 = malloc(n*sizeof(float)); 
ptr2 = calloc(n, sizeof(float)); 

printf("malloc  | calloc\n"); 
printf("----------------------\n"); 
for(i=0;i<n;i++) 
printf("%-10f %10f\n", *(ptr1+i), *(ptr2+i)); 
printf("\n"); 
free(ptr1); 
free(ptr2); 
return 0; 
} 
+2

Was meinen Sie wirkt genau wie calloc? Du bekommst Nullen? Es ist erlaubt, nichts sagt, dass du * nicht bekommen würdest. Aber nichts sagt, dass du auch Nullen bekommen wirst. –

+1

OT: Verweis auf den Aufruf des Codes an 'printf()': Der von 'malloc() 'zurückgegebene Speicher wurde nicht initialisiert. Das Drucken des Inhalts von nicht initialisiertem Speicher ruft undefiniertes Verhalten hervor. – alk

+0

Einfacher Grund: Die Seiten werden aus Sicherheitsgründen vom Betriebssystem gelöscht. Du solltest dich nie darauf verlassen. – Olaf

Antwort

6

calloc garantiert Ihnen einen genullt Speicher Brocken zu haben, während malloc nicht. Dann kann es passieren, dass malloc tut es, aber nie verlassen Sie sich darauf.

1

Der von malloc erhaltene Speicher kann alles enthalten. Es könnte Nullen enthalten oder etwas anderes enthalten.

Das folgende Beispiel zeigt (auf den meisten Plattformen) zurückgeführt, dass der Speicher von malloc hat nicht auf 0 gesetzt worden:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    char *p; 
    int i; 

    for (i = 0; i < 1024; i++) { 
    p = malloc(1024); 
    strcpy(p, "something else"); 
    free(p); 
    } 
    p = malloc(100); // Get a fresh memory block 
    printf("%s\n", p); // You should not access the memory returned from malloc without assigning it first, because it might contain "something else". 
    return 0; 
} 

Das Programm könnte alles tun, NUL ist, wir wissen nicht einmal, wenn der String - beendet, aber auf den meisten Plattformen wird der Ausgang sein:

etwas anderes

Verwandte Themen