Hinzufügen null-terminator an char-Zeiger ist, bei der Verwendung von strcpy
Ich habe ein Programm, das versucht, die strcpy()
Funktion. Ich weiß, dass, wenn man benutzt ein char-array wie: char array[10]
null-terminator kann eingestellt werden durch: array[0] = '\0';
Allerdings, wie würde ich mich über die Einstellung der null-terminator(en) bei der Verwendung von char-Zeigern?
EDIT: Das Programm kompiliert, gibt aber Müll als Ausgabe
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *target;
char *src = "Test";
target = malloc(sizeof(char));
src = malloc(sizeof(char));
strcpy(target,src);
printf("%c\n",target);
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht. Zweites argument von
strcpy()
werden mussnul
beendet, und die ersten passen muss die Anzahl der Zeichen in source + dienul
terminator.Die Fehler im code sind:
Sind Sie mit
sizeof
operator in falscher Weise, und Sie überschreiben diesrc
Zeiger zuweisen von Speicher wieder auf.Um die Länge der Zeichenfolge, die Sie brauchen
strlen()
und Sie brauchen nicht zu rufenmalloc()
auf jeden Zeiger.Sind Sie immer Müll Wert, denn Sie sind das kopieren von nicht initialisierten Daten seit
src
Punkte auf einer neu zugeteilten Raum, weil dersollten Sie nicht tun.
sizeof(char) == 1
per definition, so sind Sie zuweisen von Speicherplatz für nur 1 byte, was, wenn es ein Gültiger C-string, sein'\0'
denn es ist Platz für genau 1 Zeichen.Den richtigen
printf()
Bezeichner für ein string ist"%s"
Sie sind mit"%c"
was für ein Charakter.Den richtigen Weg, es zu tun ist
ideone
hatte die falscheprintf()
Planer.In Ihrem code
src
ist nicht null-terminiert ist. Dies ruft ein Undefiniertes Verhalten.Auch mit Hilfe
malloc(sizeof(char));
du bist allokierung von Speicher für nur eine einzigechar
element. die wahrscheinlich Sie nicht wollen.Weiter, als pro die Mann Seite von
strcpy()
, (Hervorhebung von mir)so, solange
du bist gut zu gehen. Also, Sie haben zu
src
array.target
so dass Sie halten Sie die enthaltensrc
.Abschließend noch zu erwähnen, sobald Sie verwendet habe, einen string, Sie sollen die
%s
Formatbezeichner mitprintf()
zum drucken der string.So dass Sie nicht haben, hinzufügen von null-terminate-byte, wenn SRK es bereits.
Also :
Haben Speicher für den string und ein nul-terminator. Ich verstehe nicht, warum Sie allokierung von Speicher für
src
wie ich sehe sind Sie mit einem string-literal. Nur genügend Speicher für Ziel-und tunstrcpy()
stellen Sie sicher, dass Sie nicht schreiben array out of bound".Der richtige Weg wäre, um
Machen Sie eine Notiz, wenn Sie das tun
Den string
"Test"
ist gespeichert in einem nur-lese-Position und die Adresse von diesem Standort zurückgegebensrc
. So Ihr string ist schon im Speicher und müssen keine Speicher wieder auf, die Sie versuchen zu tun, und Sie tun es zu Unrecht. So loszuwerdenmalloc()
fürsrc
Antworten bisher angesprochen haben, die Fehler in Ihren code und Ihre scheinbare Missverständnis, anstatt Ihre Frage. Zeiger auf Speicher, können indiziert werden, genauso wie arrays, so gegeben:
Kann man Elemente so:
Sourav Ghosh s Antwort ist richtig, aber für diesen speziellen Fall sollten Sie strdup() wie es behandelt sowohl Speicher-Allokation und kopieren für Sie: