2013-09-28 20 views
18

Ich versuche ein Programm zu schreiben, das eine Reihe von Strings aus einer Textdatei einliest und diese in einem Array von Strings speichert, wobei dynamisch Speicher für jedes Element zugewiesen wird. Mein Plan war, jede Zeichenfolge in einem Array mit einem Zeiger zu speichern und dann die Array-Größe zu vergrößern, wenn mehr gelesen wurde. Ich habe Probleme zu verstehen, warum mein Testcode unten nicht funktioniert. Ist das eine praktikable Idee?Dynamische Speicherzuweisung für Zeigerarrays

char *aPtr; 
aPtr =(char*)malloc(sizeof(char)); 

aPtr[0]="This is a test"; 


printf("%s",aPtr[0]); 
+1

Dies funktioniert nicht, weil Sie 'malloc' Platz für ein einzelnes Zeichen verwenden, und dann versuchen Sie, einem' char'-typisierten lvalue eine ganze Zeichenfolge zuzuweisen. –

+0

Empfohlene Lektüre: [Wann sollte ich malloc in C verwenden und wann nicht?] (Http://StackOverflow.com/a/1963812/2455888). – haccks

Antwort

15

In C ist ein String ein char*. Ein dynamisches Array vom Typ T wird als Zeiger auf T dargestellt, also für char* das wäre char**, nicht einfach ein char* wie Sie es deklariert haben.

Der Compiler hat zweifellos einige Warnungen darüber ausgegeben. Achte auf diese Warnungen, oft helfen sie dir zu verstehen, was zu tun ist.

Hier ist, wie Sie Ihre Tests starten:

char **aPtr; 
int len = 1; // Start with 1 string 
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C 
aPtr[0] = "This is a test"; 
printf("%s",aPtr[0]); // This should work now. 
+0

Um zu verifizieren (bitte ertragen Sie mich, ich bin ein Newbie =]), wenn Sie ein dynamisches Array von Zeigern auf char wünschen (z. B. wie in einer Anwendung erforderlich, wo Sie möglicherweise eine Variable Anzahl Zeichenfolgen, z Lesen einer Textdatei, ohne deren Länge zu kennen oder Benutzereingaben von unbestimmter Länge zu sammeln), dann benötigen Sie ein dynamisches Array von Char * und benötigen daher ein Char **. Das Zeichen ** kann auf verschiedene Zeichenzeiger verweisen, die die Startadresse verschiedener Zeichenfolgen sein können. –

+0

Wofür ist die 'len = 1' hier? Es sieht so aus: "Dies ist ein Test" wäre 14 Zeichen, was jeweils ein Byte ist .... aber dieser Code erwähnt nicht 14, noch ist es segfault wenn ich laufe. – nmz787

+0

@ nmz787 Beachten Sie den Typ von 'aPtr', es ist ein Doppelzeiger, also ein Array von Zeichenzeiger darstellt. Ein Char-Zeiger wird dann in das Element Null gesetzt; In diesem Code wird kein String kopiert. – dasblinkenlight

5
char * aPtr; 

ist als Zeiger auf ein Zeichen, auf die Sie Speicher zugeordnet genau 1 Zeichen zu halten.

Doing

aPrt[0] = "test"; 

adressieren Sie den Speicher für diese ein Zeichen und versuchen, die Adresse des wörtlichen "test", um es zu speichern. Dies wird fehlschlagen, da diese Adresse am wahrscheinlichsten breiter ist als ein Zeichen.

Eine Lösung für Ihren Code wäre die Zuweisung von Speicher für einen Zeiger auf ein Zeichen.

char ** aPtr = malloc(sizeof(char *)); 
aPtr[0] = "test"; 
printf("%s", aPtr[0]); 

Sind eleganter und über robuste Ansatz wäre, die gleiche zuzuweisen (sowie das Hinzufügen der obligatorischen Überprüfung Fehler), indem Sie:

char ** aPtr = malloc(sizeof *aPtr); 
if (NULL == aPtr) 
{ 
    perror("malloc() failed"); 
    exit(EXIT_FAILURE); 
} 

... 
9
char *str; //single pointer 

Damit Sie eine speichern Zeichenfolge.


speichern array of strings Sie two dimensional character array

benötigen oder sonst array of character pointers oder sonst double pointer


char str[10][50]; //two dimensional character array 

Wenn Sie diese erklären Sie braucht keinen Speicher zu reservieren, da diese statische Erklärung


char *str[10]; //array of pointers 

Hier müssen Sie Speicher für jeden Zeiger

Schleife durch Array zuzuteilen Speicher für jeden Zeiger

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 

char **str; //double pointer 

Hier Sie Speicher zuweisen müssen zuzuteilen für Anzahl der Zeiger und dann Speicher für jeden Zeiger zuweisen.

str=malloc(sizeof(char *)*10); 

Und dann Schleife durch Array zuteilen für jeden Zeigerspeicher

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 
-1

Du es völlig falsch. Die richtige Version Ihres Codes sollte wie folgt aussehen:

int main() 
{ 
char *aPtr; 
aPtr =(char*)malloc(20*sizeof(char)); 
aPtr ="This is a test"; 
printf("%s",aPtr); 
} 

Sie können Zeigerarray verwenden. wenn Sie mehrere Zeichenfolgen speichern möchten. Ja, ich weiß, die Verwendung von For-Schleife wird einfach sein. Aber ich versuche auf einfache Art und Weise zu erklären, was ein Anfänger verstehen kann.

int main() 
{ 
char *aPtr[10]; 
aPtr[0] =(char*)malloc(20*sizeof(char)); 
aPtr[0] ="This is a test"; 
aPtr[1] =(char*)malloc(20*sizeof(char)); 
aPtr[1] ="This is a test2"; 
printf("%s\n%s\n",aPtr[0],aPtr[1]); 
} 
+0

Ihr erstes Beispiel verliert Speicher, nämlich 20 Bytes. Doing 'aPtr =" Dies ist ein Test ";' Sie verlieren den Bezug zu dem, was 'malloc()' zurückgegeben hat. Dieser Speicher wurde nie benutzt und wird niemals während der Live-Zeit des Programms verwendet werden. – alk

+0

'sizeof (char)' ist '1' definition. Casting das Ergebnis von "malloc/calloc/realloc" in nicht notwendig in C oder empfohlen: http://Stackoverflow.com/a/605858/694576 – alk

+0

Dank an alle, die geantwortet haben, war es eine große Hilfe – user2826534