ich immer in Java programmiert haben, was wahrscheinlich ist, warum ich so verwirrt bin dies etwa:ich über malloc sehr verwirrt bin() und calloc() auf C
In Java erkläre ich einen Zeiger:
int[] array
und initialisieren oder es etwas Speicher zuweisen:
int[] array = {0,1,0}
int[] array = new int[3]
nun in C, es ist alles so verwirrend. Zuerst dachte ich, es war so einfach wie erklärt es:
int array[]
und es zu initialisieren oder es etwas Speicher zuweisen:
int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
Es sei denn, ich bin falsch, alle der oben genannten entspricht Java-C , Recht?
Dann habe ich heute traf einen Code, in dem ich folgendes gefunden:
pthread_t tid[MAX_OPS];
und einige Zeilen darunter, ohne jede Art von Initialisierung ...
pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
Überraschenderweise (zumindest Ich), der Code funktioniert! Zumindest in Java würde das eine nette "NullPointerException" ergeben!
Also, um:
Am korrigiere ich mit all den Java-C "Übersetzungen"?
Warum funktioniert dieser Code?
Gibt es einen Unterschied zwischen der Verwendung von
malloc(n*sizeof(int))
undcalloc(n,sizeof(int))
?
Vielen Dank im Voraus
Der 1. Absatz hat einige gefährlich zweideutige Behauptungen. Der OP versuchte nicht, Speicher einem Array zuzuordnen, er versuchte, ein (void *), die Rückkehr von malloc() zu einem Array zuzuweisen, und wenn dieses Array ein int * Array [i] gewesen wäre, wahrscheinlich in einem Für {} -Schleife würde es gut funktionieren und ist die Grundlage dafür, wie dynamische, mehrdimensionale Arrays vom Heap zugewiesen werden. Außerdem unterstützt C99 Arrays variabler Größe, die vom Stack zugewiesen wurden, eine Funktion, die einige C-Programmierer verwenden, am liebsten alloca(), mich eingeschlossen. http://stackoverflow.com/q/1018853/2548100 – user2548100
calloc() ist ziemlich genau memset (malloc (n * mysize), 0, (n * mysize)). Insbesondere weil C nullterminierte Strings verwendet, ist calloc() sehr nützlich, besonders beim Anzeigen von Strings in einem Debugger, der die Zeichenfolge normalerweise nur bis zum Nullterminator anzeigt. Wenn Sie nur mit C auskommentieren, verwenden Sie Calloc anstelle von malloc, es wird Sie davor bewahren, eine Menge nicht abgeschlossener C-String-Fehler zu machen, die Ihr Programm zum Absturz bringen können und wahrscheinlich zum Absturz bringen werden. Verwenden Sie calloc() nur für Produktion/Release-Code, wenn Sie den Puffer/Array/Vektor tatsächlich zu (_int8) 0 initialisieren müssen. – user2548100
Um nur die Dinge zu ergänzen, und ein Array-IS ist ein Zeiger. Tatsächlich ist jeder Array-Name in C genau, genau ein Zeiger auf die Basis des ersten Bytes des ersten Objekts im Array, und nichts mehr. Für Leute, die aus Java kommen.Net usw. ist es hilfreich zu wissen, dass C den Typ der Objekte/Variablen vollständig getrennt von dem Speicher hält, der ihnen zugewiesen wurde. Aus diesem Grund können Sie einen Zeiger als int darstellen, UNIONs erstellen usw. Sehr, sehr flexibel, aber gefährlich für Anfänger. Wenn Sie ein int-Array zuweisen, wird nur Speicherplatz an einem Speicherort verwendet. Sie können alles, was Sie mögen, in diesen Speicher legen. – user2548100