2016-03-28 7 views
-3

ich nur ein Programm geschrieben:Kann nicht scheinen, char gesetzt * richtig

int main() { 
    char* test = malloc(5); 
    *test = "testc"; 
    printf("Test=%c",test[4]); 
} 

Was ich erwarten würde mir „c“ geben, aber es gibt mir nichts bestenfalls, und einen Segmentierungsfehler im schlimmsten Fall. Was mache ich möglicherweise falsch? Muss ich eine separate Variable erstellen und strncpy() es ist in? Ich habe auch versucht:

int main() { 
    char* test = malloc(5); 
    char* test2 = "test" 
    strncpy(test,test2,4); 
} 

Das verhält sich richtig, aber scheint sorta lang. Mache ich hier etwas falsch?

+1

Diese Sie nicht einmal übersetzt haben, oder zumindest sollte es gegeben haben, eine Warnung schreiben soll. Warnungen nicht ignorieren, * reparieren * sie. Vor allem, um eine Frage zu stellen. –

+0

Sie haben 'strncpy' falsch verwendet. Es wäre gut, die Verwendung dieser Funktion zu vermeiden, sie ist fehleranfällig und Sie müssen ihre Dokumentation sorgfältig lesen, um Fehler in Ihrem Code zu vermeiden. Es gibt immer einen besseren Weg als Strncpy. –

Antwort

1

In Ihrem Fall

*test = "testc"; 

ist sehr falsch. Sie versuchen, einen Zeiger auf eine char Variable zu setzen. Aktivieren Sie Warnungen in Ihrem Compiler und es wird schreien.

Was sollten Sie tun, ist, entweder

  • nicht malloc tun, und ordnen Sie die Stringliteral auf den Zeiger direkt.
  • Verwenden Sie malloc() und dann strcpy() das Zeichenfolgenliteral in den Speicher, auf den der Zeiger zeigt.
  • Nicht , nicht strcpy(), strdup() verwenden und das Ergebnis im Zeiger speichern.

Der Haken (n) ist (sind)

  • ersten Fall wird die Stringliteral wird nicht modifizierbar sein.
  • Später zwei Fälle, müssen Sie free() den zugewiesenen Speicher.
  • Der letzte Weg ist ein bisschen Nicht-Standard, streng genommen.
+0

Aaah, ich sehe, danke, das hilft sehr. – Roguebantha

1

In diesem Programm

int main() { 
    char* test = malloc(5); 
    *test = "testc"; 
    printf("Test=%c",test[4]); 
} 

Sie reservierten Speicher

char* test = malloc(5); 

den Zeiger test Punkte an den zugewiesenen Speicher als Folge haben.

Wenn Sie das Prointer

*test = "testc"; 

zu reasign versucht, aber Sie eine falsche Syntax verwendet.

Expression *test hat char geben und in dieser Aussage versuchen, das erste Zeichen des Speichers zu wörtlichen durch test mit der Adresse des String, auf zuweisen.

Aber wenn Sie den Ausdruck korrekt als

test = "testc"; 

ein Speicherleck war, weil die Adresse des zugewiesenen Speichers geschrieben wird in diesem Fall und das Gedächtnis verloren kann nicht frei sein.

Und außerdem, wenn der Zeiger auf eine Zeichenfolge zeigen muss, dann müssen Sie 6 Zeichen zuordnen, um die abschließende Null bereitzustellen würde auch in den zugewiesenen Speicher gespeichert werden.

Was müssen Sie die folgende

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

int main(void) 
{ 
    char *test = malloc(6); 

    strcpy(test, "testc"); 
    printf("Test=%c\n",test[4]); 

    free(test); 
} 

oder Sie könnten nur

#include <stdio.h> 

int main(void) 
{ 
    char *test = "testc"; 

    printf("Test=%c\n",test[4]); 
} 
Verwandte Themen