2016-07-01 6 views
0

Я пытаюсь создать простую программу, которая просто записывает вашу рабочую директорию в файл, и я не могу, для жизни меня, выяснить, что я делаю неправильно. Независимо от того, что я делаю, мой буфер хранит null после моего вызова getcwd(). Я подозреваю, что это может быть связано с разрешениями, но, как утверждается, linux теперь сделал какое-то волшебство, чтобы гарантировать, что getcwd почти никогда не имеет проблем с доступом (ключевое слово «почти»). Может ли кто-нибудь проверить его на своих машинах? Или есть явная ошибка, которую мне не хватает?Последовательное получение нулевой ценности в C String с использованием 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; 
} 

скомпилирован с gcc main.c (файл с именем «main.c»)

EDIT: Как было отмечено различными плакатами, SizeOf (LOC) принимает размер указателя полукокса, а не размер пространства, выделенного этому указателю. Изменил его на malloc (sizeof (char) * 1000), и все это работает подливки.

+0

Minor придираться: 'SizeOf (Char)' гарантированно будет 1 так что наличие его там в лучшем случае синтаксический сахар. – Magisch

+3

'sizeof (loc)' не делает то, что вы думаете, что он делает. –

+1

Кроме того, 'sizeof (loc)' даст вам размер указателя char, а не размер вашей памяти, выделенный для 'loc' – Magisch

ответ

2

Ваша проблема здесь:

size_t size = sizeof(loc); 

Вы получаете размер указателя полукокса, не выделенной памяти для гольца.

Изменить это:

size_t size = sizeof(char) * 10000; 

или даже

size_t size = 10000; 

поскольку sizeof(char) гарантированно будет 1.

И так как вы используете size в вашем последующем вызове getcwd , у вас, очевидно, будет слишком мало места для хранения большинства дорожек, поэтому ваш результат неудивительный

Если вы не хотите менять разные коды в коде при каждом изменении, вы можете использовать замену текста #DEFINE, чтобы решить эту проблему.

Как это:

#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

Более конкретно, поскольку «размер» был (возможно) установлен на 4 или 8, он просто не был достаточно большим, чтобы хранить большинство путей для текущего каталога, если только вы не работаете в '/ tmp' или что-то подобное , –

 Смежные вопросы

  • Нет связанных вопросов^_^