Drucken des aktuellen Arbeitsverzeichnisses in c mit Zeigern
Frage
Ziel :Drucken Sie das aktuelle Arbeitsverzeichnis in c auf einem Linux-Computer aus.
Ohne Zeiger zu verwenden, gibt es die richtige Ausgabe..
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main()
{
//char buf[1024];
char * buf;
char * cwd;
buf = (char *)malloc(sizeof(char) * 1024);
if((cwd = getcwd(buf, sizeof(buf))) != NULL)
printf("pwd : %s\n", cwd);
else
perror("getcwd() error : ");
return 0;
}
Aber mit Zeiger zeigt es folgenden Fehler
getcwd() error : : Numerical result out of range
Lösung
Dies liegt daran, wenn buf
ist ein Zeiger, sizeof(buf)
ist die Anzahl der Bytes, die zum Speichern eines Zeiger, nicht die Größe des Arrays, wie im Code, den Sie auskommentiert haben.
Sie müssen die von Ihnen zugewiesene Größe übergeben (z.1024) stattdessen so:
size_t allocSize = sizeof(char) * 1024;
buf = (char *)malloc(allocSize);
if((cwd = getcwd(buf, allocSize)) != NULL) ...
Andere Tipps
sizeof(buf)
gibt die Größe von zurück char*
dies ist jedoch so viele Bits breit, wie Ihr Prozessor ist (32 Bit oder 64 Bit).
Sie möchten die magische Zahl verwenden, mit der Sie malloziert haben, in diesem Fall 1024.
Versuchen Sie dies:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
//char buf[1024];
char * buf;
char * cwd;
buf = (char *)malloc(sizeof(char) * 1024);
if((cwd = getcwd(buf, 1024)) != NULL)
printf("pwd : %s\n", cwd);
else
perror("getcwd() error : ");
return 0;
}
char *getcwd(char *buf, size_t size);
Hier geben Sie die Größe als an sizeof(buf)
welches wird die Größe des zurückgeben buf
zeiger, der maschinenabhängig sein wird.
Sie müssen 1024 im Argument angeben, um getcwd
.