Reservieren 2D char array mit malloc oder calloc
Ich habe vor kurzem beschlossen, zu putzen, bis mein C-wissen (was wenig ich habe). Ich habe ziemlich schnell gemerkt, dass die ersten skill zu gehen, bewölkt war memory management. Verdammt.
Habe ich beschlossen, dass das beste, was zu tun war, war zu schreiben, sinnlos Zeiger übungen. Die erste war, um zu reservieren ein array mit 4 char-arrays, von denen jede eine variable Länge.
Eine vereinfachte version des Codes:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **aStr = malloc(4*sizeof(aStr));
int j = 0;
int i = 0;
while(i<sizeof(aStr))
{
j = 4 + 2*i;//in my code, length is determined by arguments
aStr[i] = malloc(j*sizeof(aStr[i]));
j--;
strncpy(aStr[i],"RaisinRubarbCarrot"+i,j);
aStr[i][j] = 0;//just a habbit
j++;
printf("ptr@:%p\n\tkey:%d\n\tval:%s\n\tlength:%d (%d)\n\n",*aStr[i],i,aStr[i],j,strlen(aStr[i]));
i++;
}
free(aStr);
return 0;
}
Fühlte ich, dass dies zu klobig, und counter-intuitive. Heute erinnerte ich mich an meine alte nemisis: calloc
. Ich schrieb dann
char **aStr = (char **)calloc(4, sizeof(char *));
und in der Schleife:
aStr[i] = (char *) calloc(j,sizeof(char *));
Habe ich gefunden, code-Beispiele, dass die Letzte Zeile schreiben etwa so:
aStr[i] = (char *) calloc(j,sizeof(char));//without the asterisk
Frage 1: was ist der Unterschied, wenn überhaupt?
Frage 2: gibt es nicht einen anderen Weg der Zuweisung ein array von strings? so wie ich das sehe der code jetzt, es fühlt sich an/sieht aus wie ich bin erste Zuteilung 4 Zeiger auf ein einzelnes char-Zeiger, und dann die Zuweisung der tatsächlich benötigte Größe für jeden Zeiger. Das fühlt sich einfach falsch.
Dann wieder ich könnte falsch sein über all dies zusammen, in dem Fall: fühlen Sie sich frei zu schlagen, meinen Kopf gegen die Wand und Stelle mich in die Richtung, in der eine anständige Anleitung, ich sollte Lesen, bevor Sie verschwenden all Ihre Zeit...
aStr[i] = (char *) calloc(j,sizeof(char));
nichtsizeof(char *)
- Ich dachte mir so, seltsamerweise, beide kompilieren ganz gut, keine Warnungen ausgegeben
- so? ich doesnt bedeuten, dass es korrekt ist. es muss nicht Klagen, weil a) Sie Stimmen beide Ergebnisse auf die richtige Art b) Sie nicht wissen, was Sie tun möchten. ich bin nicht einmal sicher, Sie müssen gegossen
sizeof(char)
1 ist per definition, und Sie sollten nicht gegossen. So sollte es seinaStr[i] = calloc(j, 1);
nur.- sizeof(char) sein könnte, morereadable
Du musst angemeldet sein, um einen Kommentar abzugeben.
char *
undchar
sind zwei verschiedene Arten, und haben unterschiedliche Daten, Größen. Einchar
ist immer ein einzelnes byte, sosizeof(char)
ist immer 1. Ein Zeiger auf char auf der anderen Seite, werden 4 Byte auf einem 32-bit system. Also, wenn Siesizeof(char*)
zum reservieren von Speicherplatz für einen string, Sie werden allozieren, viel mehr, als Sie brauchen.Mithilfe der Schleife eine Zuordnung der einzelnen Saiten ist gut. Unter der Annahme einer maximalen Länge für Ihre Saiten, Sie könnte nur die Zuordnung einer big block, aber das wäre ungeschickt.
calloc
odermalloc
, weil in beiden Fällen der code macht das gleiche. Ich bin derzeit mitcalloc
da passt das Ziel besser IMOcalloc
initialisiert die Daten-Elemente zu null für Sie, und so können verhindern, dass bestimmte Fehler. Sonst sind Sie gleichwertig: nutzen Sie einfach, was Sie denken liest sich besser. Aber wenn Siemalloc
bewusst sein, dass der Speicher nicht initialisiert zu nichts und wird gefüllt mit junk-Daten.Sollten Sie verwenden, sizeof(char) anstelle von sizeof(char*), weil Sie versuchen, Speicher für ein array von chars und nicht ein array von poiners chars. Das ist also die richtige version:
Den Unterschied/Vorteil von calloc über malloc ist, dass es auch initialisiert die Speicherstellen auf 0.
Du zuerst alloziert ein array mit 4 Zeigern auf chars. Und dann, Sie Speicher reservieren für die einzelnen Zeichenfolgen (jeder der 4 Zeiger, die zuvor zugeordnete Punkt zu einem dieser arrays)
sizeof(char) == 1
obwohl.