2016-04-02 6 views
3

Wenn ich einen Zeiger habe: char ** tmp = (char **)malloc(sizeof(char *) * MAX_SIZE), nach dem Zuweisen von Werten zu jedem Block, habe ich einen neuen Zeiger char ** ptr = tmp.C malloc ein Zeiger mehrmals

1). Kann ich tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) malloc es wieder ohne free es?

2). Hat der ptr noch die Werte und auch tmp zeigt auf einen neuen Speicherblock?

Ich habe eine Funktion, um alle verwendeten Speicher am Ende zu befreien, also mach dir keine Sorgen über free.

+1

einfache Antwort 1 = ja, 2 = ja. mehr Erklärung: Wenn du 'malloc' das erste Mal einen Speicherblock zugewiesen hast, erhält' tmp' den Zeiger auf diesen Ort. dann speichern Sie den Zeiger auf 'ptr' (jetzt haben sowohl' tmp' als auch 'ptr' den Zeiger auf dieselbe Position). Wenn Sie das zweite 'malloc' aufrufen, wird ein weiterer Speicherblock zugewiesen und' tmp' erhält den neuen Zeiger. aber 'ptr' haben immer noch den alten. – bansi

Antwort

1

Die Zuordnung tmp zu ptr enthält einen Verweis auf den Speicherbereich. Das erneute Zuweisen von tmp unter Verwendung eines neuen Anrufs an malloc ist kein Problem. Dies wird den Bezug auf den Speicher nicht verlieren, da ptr ein vorhandener Alias ​​ist.

So

  1. ja, können Sie eine andere malloc tun. (Sie könnten trotzdem tun, würde aber Bezug auf malloced Speicher verlieren)

  2. Ja, ptr verweist immer noch die malloced Bereich

BTW, ein freies tun am Ende wenn dies ziemlich sinnlos sein könnte würde sich auf am Ende des Programms beziehen. Also, ich nehme an, Sie meinen, am Ende des aktuellen Algorithmus.

Wie auch immer, Sie müssen Referenzen auf den zugewiesenen Speicher behalten. Normalerweise ist es ratsam, diesen Speicher freizugeben, sobald er nicht mehr benutzt wird.

+0

Ja, ich verstehe, weil ich diese Referenz in einer anderen Funktion verwenden werde, nach der Verwendung wird der Speicher sofort freigegeben. Danke für deinen Rat! –

1

1). Kann ich tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) malloc es wieder ohne es frei?

Ja, Sie können wieder Speicher reservieren. Aber tmp zeigt jetzt auf einen neuen zugewiesenen Speicher und auf zuvor zugewiesenen Speicher.

2). Hat der ptr noch die Werte und auch tmp zeigt auf einen neuen Speicherblock?

Jetzt wird tmp auf neu zugewiesenen Speicher zeigen aber ptr bezieht sich auf den vorherigen Speicherplatz, die zugeordnet wurde.

So auf diese Weise verlieren Sie nicht den Bezug zu irgendeinem der Speicherblock und kann freigegeben werden.

1

malloc wird verwendet, um einen Speicherblock zuzuordnen. Es weist einen Speicherblock mit der angegebenen Größe zu und gibt einen Zeiger an den Anfang des Blocks zurück.

Also das erste Mal, wenn Sie schreiben

char ** tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) 

es reserviert Speicher und geben einen Zeiger auf Anfang Speicherplatz Temp. Wenn Sie jetzt tmp zu ptr zuweisen, zeigt ptr jetzt auf den zugewiesenen Speicher zusammen mit tmp. Wenn Sie jetzt tmp = (char **)malloc(sizeof(char *) * MAX_SIZE) schreiben, wird es einen neuen Speicher zuweisen und einen Zeiger zurückgeben, auf den tmp zeigt. Aber ptr zeigt immer noch auf den zuvor zugewiesenen Speicher. Die Antwort auf beide Fragen ist also JA.

Ich hoffe, ich konnte die Dinge richtig erklären.

+0

Gute Erklärung! Vielen Dank! –

0
int main(int argc, char **argv) { 

    tmp = (char**)malloc(sizeof(char*) * argc); 
    while (argv[i]) 
    { 
     tmp[i] = strdup(argv[i]); 
     i++; 
    } 
    if (argc > 3) 
     printf("%s", argv[2]) 
    return(0)} 
+0

Dies beantwortet die Fragen des OP nicht. Auch Code ohne Erklärung ist nicht sehr hilfreich. – isedev