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)); nicht sizeof(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 sein aStr[i] = calloc(j, 1); nur.
  • sizeof(char) sein könnte, morereadable
Schreibe einen Kommentar