2016-06-10 9 views
0

Ich habe versucht, c jetzt für eine Weile, aber ich kann nicht mit Zeiger-Arrays.
zum BeispielHinzufügen einer Zeichenfolge zu Zeiger auf Zeiger in c zeigt nichts beim Zugriff

char *word; 
char *container[100]; 

In den folgenden for-Schleife i am Anhang einzelnen Buchstaben in einem String Temp dann will ich zu * Behälter [100], wenn das Trennzeichen hinzuzufügen. ist erschienen.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 


int main() 
{ 
    int z = 0; 
    int k=0; 
    char *word; 
    char *container[100]; 
    char *in = " First Word . Second Word"; 
    for(k=0; k<strlen(in); k++) 
    { 
     //using . as a delimiter 
     if(in[k]=='.') 
     { 
      container[z] = word; 
      printf("%s\n", container[z]); //<---- this prints okey inside loop 
      z++; 
      memset(word,0,strlen(word)); 
     } 
     else 
     { 
      //appending characters to temp, using some method 
      snprintf(word + strlen(word), (sizeof word) - strlen(word), "%c", in[k]); 
     } 
    } 
//doesnt print anything outside the loop 
printf("Does it print: %s\n", container[0]); 
printf("Doest it print: %s\n", container[1]); 

    return 0; 
} 

wenn ich versuche, die Worte in Behälter drucken es etwas zeigen tut:

printf("%s\n", container[0]); 
printf("%s\n", container[1]); 

Ich glaube, ich irgendeine Art von Dynamic Allocation zu tun haben. Aber ich weiß nicht wie.

+3

Bitte senden Sie eine [mcve] –

+2

erklären Sie Ihren Code besser, was ist Temp? Behälter [z] ??? –

+0

Haben Sie es falsch kopiert? 'Was soll 'container [z]' tun? – Barmar

Antwort

1

Der Zeiger word wird nicht initialisiert, bevor Sie ihn verwenden. Dies führt zu undefiniertem Verhalten. Wenn Sie Glück haben, erhalten Sie einen Segmentierungsfehler, so dass Sie auf das Problem aufmerksam gemacht werden und es beheben können. Wenn Sie Pech haben, funktioniert es irgendwie, aber es gibt seltsame Nebenwirkungen, wie mysteriöse Überschreiben anderer Variablen.

Außerdem gibt sizeof word die Zeigergröße und nicht die Größe des (zugewiesenen) Speicherbereichs zurück, auf den er zeigt.

Die Probleme mit word können, indem sie eine Anordnung festgelegt werden:

char word[100]; 

Jetzt word enthält 100 Byte Speicher, die wir sicher schreiben können und sizeof word-100 bewerten wird.

Das nächste Problem ist, wenn Sie die container Zeiger auf Punkt auf word zuweisen. Dies wird nicht eine Kopie der Zeichenfolge in word enthaltenen enthalten. Später, wenn Sie den Inhalt eines Wortes überschreiben, wird auch der Inhalt von container[i] überschrieben, da er auf denselben Speicherplatz zeigt. Sie können strdup verwenden eine dynamisch zugewiesene Kopie zu erstellen:

container[z] = strdup(word); 

Hinweis: strdup() ist eine POSIX-Funktion und nicht Teil der C-Spezifikation. Auf Plattformen, die nicht über strdup() verfügen, können Sie die gleiche Aufgabe mit malloc + strcpy ausführen.

+0

yayy, das reparierte es ... ich wusste, dass es wegen des Speicherorts war, aber ich war mir nicht sicher. Vielen Dank für die Klärung dieses Konzepts für mich. :) –