0

我正在尝试制作一个简单的程序,只需将您的工作目录写入文件,而我终其一生都无法弄清楚我做错了什么。无论我做什么,在我调用 getcwd() 之后,我的缓冲区都会存储空值。我怀疑这可能与权限有关,但据称,Linux 现在做了一些魔法来确保 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”)

编辑:正如不同的海报所提到的, sizeof(loc) 正在采用 char 指针的大小,而不是分配给该指针的空间量的大小。将其更改为 malloc(sizeof(char)*1000) 并且一切正常。

4

1 回答 1

2

你的问题在这里:

size_t size = sizeof(loc);

您获得的是 char 指针的大小,而不是为您的 char 分配的内存。

将其更改为:

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;
}
于 2016-07-01T06:22:14.520 回答