使用 getcwd 在 C 字符串中始终获取空值
Consistently Getting Null Value in C String using getcwd
我正在尝试制作一个简单的程序,将您的工作目录写入一个文件,但我无法确定我做错了什么。无论我做什么,我的缓冲区在调用 getcwd() 后都会存储空值。我怀疑这可能与权限有关,但据称,linux 现在做了一些魔法来确保 getcwd 几乎永远不会出现访问问题(关键字,"almost")。任何人都可以在他们的机器上测试它吗?还是我遗漏了一个明显的错误?
#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")
编辑:正如不同的海报所提到的,sizeof(loc) 正在采用 char 指针的大小,而不是分配给该指针的 space 数量的大小。将其更改为 malloc(sizeof(char)*1000) 并且一切正常。
你的问题在这里:
size_t size = sizeof(loc);
您获得的是 char 指针的大小,而不是为您的 char 分配的内存。
改为:
size_t size = sizeof(char) * 10000;
甚至
size_t size = 10000;
因为 sizeof(char)
保证为 1。
并且由于您在随后对 getcwd
的调用中使用了 size
,显然您的 space 太少而无法存储大多数路径,因此您的结果不足为奇
如果您不想在每次更改代码时都更改多个不同的数字,您可以使用#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;
}
我正在尝试制作一个简单的程序,将您的工作目录写入一个文件,但我无法确定我做错了什么。无论我做什么,我的缓冲区在调用 getcwd() 后都会存储空值。我怀疑这可能与权限有关,但据称,linux 现在做了一些魔法来确保 getcwd 几乎永远不会出现访问问题(关键字,"almost")。任何人都可以在他们的机器上测试它吗?还是我遗漏了一个明显的错误?
#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")
编辑:正如不同的海报所提到的,sizeof(loc) 正在采用 char 指针的大小,而不是分配给该指针的 space 数量的大小。将其更改为 malloc(sizeof(char)*1000) 并且一切正常。
你的问题在这里:
size_t size = sizeof(loc);
您获得的是 char 指针的大小,而不是为您的 char 分配的内存。
改为:
size_t size = sizeof(char) * 10000;
甚至
size_t size = 10000;
因为 sizeof(char)
保证为 1。
并且由于您在随后对 getcwd
的调用中使用了 size
,显然您的 space 太少而无法存储大多数路径,因此您的结果不足为奇
如果您不想在每次更改代码时都更改多个不同的数字,您可以使用#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;
}