Kostenlose char-Zeiger in c
Ich versuche herauszufinden, Dateitypen mit c-code hier ist der code
char *get_file_type(char *path, char *filename)
{
FILE *fp;
char command[100];
char file_details[100];
char *filetype;
sprintf(command, "file -i %s%s", path, filename);
fp = popen(command, "r");
if (fp == NULL) {
printf("Failed to run command\n" );
exit(1);
}
while (fgets(file_details, sizeof(file_details)-1, fp) != NULL) {
filetype = (strtok(strstr(file_details, " "), ";"));
}
pclose(fp);
return filetype;
}
hier statt deklarieren Befehl[], kann ich mit *Befehl? Ich habe versucht, es zu benutzen, aber es throwed eine Ausnahme. wir brauchen nicht, um freie Variablen erklärt, wie command[]? wenn ja, wie?
InformationsquelleAutor Sandeep Manne | 2010-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
char *command;
, aber dann müssen Sie reservieren von Speicher fürcommand
zu finden, um mit einem Aufrufmalloc()
und wenn Sie fertig sind mit, dass der Speicher, es hat befreit werden und wieder mit einem Aufruffree()
.Wie Sie sehen können, dass ist viel mehr Arbeit als die Verwendung eines Arrays fester Größe (wie Sie jetzt tun), aber es kann gemacht werden viel sicherer, denn man konnte ein Puffer, der genau die richtige Größe, anstatt zu hoffen, dass die Gesamtlänge der Befehl wird nicht länger als 100 Zeichen sein.
Abgesehen davon, dass dein code hat ein problem: Die
filetype
Zeiger, den die Funktion zurückgibt, verweist auf eine Position innerhalb des Arraysfile_details
, aber das array wird bereinigt werden, indem der compiler beim ausführen derreturn
Aussage, also der Zeiger wird von der Funktion zurückgegeben wird, bezieht sich auf einige Speicher, ist gekennzeichnet als "frei werden für andere Zwecke verwendet".Wenn es nicht ein problem, dass das Ergebnis
get_file_type
gilt nur für eine Datei gleichzeitig, Sie können erklären, diefile_details
array alsstatic
, so dass es bewahrt werden über Aufrufe der Funktion.Können Sie, aber dann müssen Sie daran denken nennen
free
in der aufrufenden Funktion(en) um Speicherlecks zu vermeiden.InformationsquelleAutor Bart van Ingen Schenau
Wenn Sie ein array deklarieren:
den compiler reserviert den Speicher (100 chars in diesem Fall) und die
command
Punkte zum start, dass der Speicher. Sie können den Zugriff auf den Speicher haben Sie reserviert:aber Sie können nicht ändern Sie den Wert von
command
:Der Speicher wird automatisch freigegeben, wenn
command
geht out of scope.Beim deklarieren einen Zeiger:
erstellen Sie nur eine einzige variable für den Hinweis auf
char
s, aber es funktioniert nicht alles noch. Versucht, es zu benutzen, ohne Initialisierung es ist ein Fehler:Müssen Sie den Speicher selbst mit
malloc
:und freigeben, wenn Sie fertig sind mit es:
InformationsquelleAutor Nefrubyr
Warum sollte man es ändern? Für temporäre Puffer, die in der Regel Menschen deklarieren die arrays mit [], so dass Sie nicht haben, um sorgen über die Müll-Entsorgung.
Für eine Sache, wäre es wahrscheinlich sinnvoll, zu dynamisch reserviert einen Puffer basierend auf den Längen der
path
undfilename
eher als leise so dass ein buffer overflow. (C99 array mit variabler Länge würde dieses Problem lösen, obwohl. Mitsnprintf
stattsprintf
ratsam wäre auch.)Dies sollte ein Kommentar...
InformationsquelleAutor Alexander Rafferty