2016-08-05 46 views
0

Ich habe so Array mit einer Größe von 24 byte:Wie im Speicher Array von char * löschen?

char* arr[3] = {"CERN", "0", "ALK"}; 
printf("%ld\n", sizeof(arr)); 

Dann versuche ich aus dem Gedächtnis dieses Array zu löschen, indem \0 zu jedem Element des Arrays zuweisen:

for (size_t i = 0; i < sizeof(arr)/ sizeof(char*); ++i) { 
    arr[i] = '\0'; 
} 

Aber wenn ich will das überprüfen Größe des Arrays, gibt es mir noch 24 byte:

printf("%ld\n", sizeof(arr)); 
> 24 

Wie völlig klar, dass dies ein aus dem Speicher rray, sizeof(arr) würde 0 geben?

+3

Da dies ein statisches Array ist, können Sie die Variable nicht aus dem Speicher entfernen ... – m13r

+0

'sizeof (arr)/sizeof (char *);' -> 'sizeof (arr)/sizeof (arr [0]); ' – LPs

+0

' arr [i] = '\ 0'' -> 'arr [i] = NULL' – LPs

Antwort

1

Sie haben dem Array Nullen zugewiesen, aber das ist alles. Sie haben nicht geändert (und können nicht, da Sie nicht malloc() es) die Menge des Speichers, die dem Array zugewiesen ist, löschte nur die Daten darin.

3

sizeof(arr) ist die Größe von drei char*. Es ändert sich nicht, wenn Sie jeden der Zeiger auf 0 festlegen.

Wie Sie dieses Array vollständig aus dem Speicher löschen, dass sizeof (arr) 0 geben würde?

Es gibt keine Möglichkeit, ein Array zu löschen, das beim automatischen Speichern zugewiesen wurde. Sie müssen es wirklich nicht "löschen".

Beachten Sie, dass Sie %zu verwenden sollten, um einen size_t Wert zu drucken, der sizeof Operator ergibt. Verwenden eines falschen Formatbezeichners ist undefined behaviour.

+0

Wenn ich Array nicht löschen muss ... was ist mit Speicherleck? –

+1

Speicherleck kann nur auftreten, wenn Sie * dynamische Speicherzuweisung * verwenden, wie z. B. 'malloc()' oder 'calloc()' oder 'realloc()' oder andere Funktionen, die Zeiger auf dynamisch zugewiesenen Speicher wie 'strdup () '. Es gibt keinen Speicherverlust in Ihrem Code. Das Array "arr" hat drei Zeiger, die auf den automatischen Speicher (aka * stack *) zugewiesen sind, und jeder der Zeiger zeigt auf ein * String-Literal *. Sie haben selbst keinen Speicherplatz zugewiesen. –

2

Nein, nein, nein. Es gibt verschiedene Probleme hier:

  1. Wenn Sie einen Block von Speicher löschen möchten, verwenden Sie memset()

  2. Wenn Sie eine Zeichenfolge auf Null wollen, alles, was Sie tun müssen, ist das erste Zeichen gesetzt zu null: arr[0] = 0;

  3. Die sizeof operator sagt Ihnen die Größe Ihres Arrays.

  4. Die strnlen() teilt Ihnen die Länge Ihrer Zeichenfolge mit.

Auch wenn Sie 3 Bytes für Ihren Array zugewiesen haben, ist die tatsächliche Länge des Strings kann 0, 1 oder 2.

Es kann nie „3“ sein ... weil Sie brauchen mindestens ein Byte für Ihren Terminator.

-1

können Sie einen Blick auf diesen Beitrag, da sie den Unterschied zwischen statisch und dynamisch zugewiesenen Speicher erklärt:

What and where are the stack and heap?

+1

Dies ist keine Antwort. Es ist ein Kommentar. –

+0

es ist die Antwort, da es das Konzept erklärt. Wenn der OP das Konzept versteht, versteht er, dass die Frage keinen Sinn ergibt. – murphy

+0

es ist eine Verbindung nur Antwort und fügt keinen Wert als Antwort hinzu. –

1

Wie völlig klar, dass diese Anordnung aus dem Gedächtnis, dass sizeof(arr) würde 0 geben?

Es ist nicht möglich, Ihre Erklärung zu geben.

Sie müssen mit einer anderen Logik kommen, um 0 - die Anzahl der Elemente in arr, die nicht NULL sind.

int my_own_array_size(char* arr[], int numElements) 
{ 
    int count = 0; 
    for (int i = 0; i < numElements; ++i) 
    { 
     if (arr[i] != NULL) 
     ++count; 
    } 
    return count; 
} 

und es verwenden, dann als:

int count = my_own_array_size(arr, 3); 
1

char * arr [3] = { "CERN", "0", "Alk"};

  • Hier arr ist ein Array von 3 char Zeiger. Jedes Element hat eine Größe von 8 Bytes (auf 64-Bit-System).
  • So Größe arr wird immer 24 (3 * sizeof (void *)) unabhängig von der durch Zeiger verweist auf Speicher (viz. Eine Adresse oder NULL, die weiter als char oder string.This interpretiert wird, hat nichts zu tun mit arr size)
  • Oberhalb for loop wird nur die Zeiger auf NULL initialisieren.

Wie völlig klar, dass diese Anordnung aus dem Speicher, die sizeof (arr) 0 geben würde?

Es handelt sich um eine statische Zuweisung (entweder eine Auto/Global-Variable). Speicher zugewiesen für arr kann nicht gelöscht werden.

Anmerkung: In diesem Fall "CERN", "0", "ALK" ist in nur Segment gelesen wahrscheinlich gespeichert.