2016-07-01 19 views
0

Ich versuche, ein einfaches Programm, das nur Ihr Arbeitsverzeichnis in eine Datei schreibt, und ich kann nicht für das Leben von mir herausfinden, was ich falsch mache. Egal was ich mache, mein Puffer speichert null nach meinem Aufruf von getcwd(). Ich vermute, dass es vielleicht mit Berechtigungen zu tun hat, aber angeblich hat Linux jetzt einige Zauberei gemacht, um sicherzustellen, dass getcwd fast nie Zugriffsprobleme hat (Stichwort "fast"). Kann jemand es auf ihren Maschinen prüfen? Oder gibt es einen offensichtlichen Fehler, den ich vermisse?Konsequent NULL-Wert in C-String mit Getcwd

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

int main(int argc, char *argv[]) 
{ 
     printf("Error is with fopen if stops here\n"); 
     FILE* out_file = fopen("dir_loc.sh","w+"); 
     char* loc = malloc(sizeof(char)*10000); 
     size_t size = sizeof(loc); 
     printf("Error is with cwd if stops here\n"); 
     loc = getcwd(loc,size); 
     printf("%s",loc); 
     fprintf(out_file,"cd %s",loc); 
     printf("Error is with fclose if stops here\n"); 
     free(loc); 
     fclose(out_file); 
     return 0; 
} 

kompiliert mit gcc main.c (die Datei "main.c" genannt)

EDIT: Wie von verschiedenen Plakaten erwähnt wurde, sizeof (loc) wurde die Größe eines char Zeiger nehmen, und nicht die Größe des Speicherplatzes, der diesem Zeiger zugewiesen ist. Änderte es zu malloc (sizeof (char) * 1000) und alles funktioniert Soße.

+0

Minor Nitpick: 'sizeof (char)' ist garantiert 1 so zu sein, es hat dort besten syntaktischer Zucker ist. – Magisch

+3

'sizeof (loc)' tut nicht, was Sie denken, dass es tut. –

+1

Außerdem gibt 'sizeof (loc)' Ihnen die Größe eines char-Zeigers, nicht die Größe Ihres Speichers, der 'loc' zugeordnet ist. – Magisch

Antwort

2

Ihr Problem ist hier:

size_t size = sizeof(loc); 

Sie bekommen die Größe eines char-Zeiger, nicht die zugewiesenen Speicher für Ihre char.

ändern Sie es an:

size_t size = sizeof(char) * 10000; 

oder sogar zu

size_t size = 10000; 

seit sizeof(char) garantiert 1.

sein Und da Sie size in Ihrem nachfolgenden Aufruf von getcwd mit sind , du wirst offensichtlich zu wenig Platz haben, um die meisten Pfade zu speichern, also ist dein Ergebnis nicht überraschend

Wenn Sie nicht jedes Mal mehrere Codes im Code ändern möchten, wenn Sie eine Änderung vornehmen, können Sie dies mit #DEFINE text replacement beheben.

So:

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define LOC_ARRAY_SIZE 10000 // Here you define the array size 

int main(int argc, char *argv[]) 
{ 
     printf("Error is with fopen if stops here\n"); 
     FILE* out_file = fopen("dir_loc.sh","w+"); 
     char* loc = malloc(sizeof(char)*LOC_ARRAY_SIZE); // sizeof(char) could be omitted 
     size_t size = sizeof(char)*LOC_ARRAY_SIZE; 
     printf("Error is with cwd if stops here\n"); 
     loc = getcwd(loc,size); 
     printf("%s",loc); 
     fprintf(out_file,"cd %s",loc); 
     printf("Error is with fclose if stops here\n"); 
     free(loc); 
     fclose(out_file); 
     return 0; 
} 
+0

Da "size" (wahrscheinlich) auf 4 oder 8 gesetzt wurde, war es einfach nicht groß genug, um die meisten Pfade für das aktuelle Verzeichnis zu speichern, es sei denn, Sie laufen in '/ tmp' oder etwas Ähnlichem . –