【问题标题】:getcwd() returns NULL after new pointer is createdgetcwd() 在创建新指针后返回 NULL
【发布时间】:2012-10-24 10:28:02
【问题描述】:

我刚开始学习linux和C,请不要严格评判我。

我正在尝试查找当前工作目录并在此目录中打开文件以查找特定单词。如果我只找到 cwd,它会给出正确的 cwd,但是当我添加 while 循环时 cwd 为空。

#include <unistd.h>
#include <stdio.h>
#include <limits.h>
main(){
char *buff;
char *currentDir =getcwd(buff,PATH_MAX);

printf("Current directory: %s\n",currentDir);

FILE *file;
char *filename = "profile";
file = fopen(filename,"r");
if(file == NULL)
{
fprintf(stderr,"File %s wasn't found\n",filename);
}

while(1)
{
    char buffer[80];
    char *token;
    fgets(buffer,80,file);
    if(feof(file))
    {break;}
    else{
    *token = strtok(buffer,"=");
        if(strcmp(token,"HOME")==1);
        {
        printf("HOME token is found");
        } 
    }
free(token);
}

fclose(file);
}

输出: 当前目录:(空) 分段错误

【问题讨论】:

  • 安装 ddd 调试器它会帮助你
  • 您也不能在 printf 语句后声明 FILE* char * 等
  • @BhavikShah 自 C99 以来,您已经能够在标准 C 中混合变量声明和代码(在此之前作为许多编译器的扩展)。
  • 我回滚了你最新的编辑,因为它使我的答案难以理解。

标签: c segmentation-fault getcwd


【解决方案1】:

buff 指向随机内存。

您可能想像这样声明buff

char buff[PATH_MAX] = "";

如果在 Linux 上,也可以让getcwd() 分配所需的内存:

char * currentDir = getcwd(NULL, 0);

currentDir 完成后需要传递给free(),然后不需要buff

【讨论】:

  • buffer 被初始化为调用fgets()。所以,没问题。
  • 对不起,请问您指的是什么? @OlafDietsche
  • 对不起,我的错。我混淆了buffbuffer。但这里也一样。无需使用= "" 进行初始化,因为buff 是通过调用getcwd() 进行初始化的。
  • 如果getcwd() 失败,buff 可能未初始化。 @OlafDietsche
【解决方案2】:

删除线:

免费(令牌);

token 指向堆栈上的buffer。所以,不需要释放它。

另一个错误是:

*token = strtok(buffer,"=");

strtok() 返回一个char*,所以应该这样写:

token = strtok(buffer,"=");

您还应该将循环修改为:

#include <string.h>

...
char buffer[80];
while (fgets(buffer,80,file)) {
    char *token = strtok(buffer,"=");
    if (strcmp(token,"HOME") == 0);
    {
        printf("HOME token is found");
    }
...

【讨论】:

  • 感谢奥拉夫。我明白为什么我有令牌初始化错误。我编辑了它,但编译器说 "char *token = strtok(buffer,"=");" 这一行赋值使指针从整数不进行强制转换
  • 好吧,我错过了。您需要包含string.h。还要将您的strcmp() 更改为== 0,因为1 表示大于,0 等于,-1 小于。
  • #include &lt;string.h&gt; 包括strtok(), strcmp(), ... 的声明。如果使用没有声明的函数,编译器会假定返回值为int,在这种情况下是错误的:char*strtok(char*, const char*)
【解决方案3】:

获取当前目录的小函数:

void get_working_dir(void) 
{
    char buf[PATH_MAX];

    if (getcwd(buf, sizeof(buf)) == NULL) {
       fprintf(stderr, "Err.:(%d) - %s: curr. workdir\n", errno,strerror(errno));
       exit(EXIT_FAILURE);
    }

    /* print current directory */
    printf("%s\n", buf);
}

调用函数:

get_working_dir();

【讨论】:

  • 在失败时调用退出不是预期的行为 - 我不建议在没有充分理由的情况下这样做。
【解决方案4】:

我遇到了同样的问题,所以我查看了手册页,据说 getcpw() 系统调用将在缓冲区为 NULL 时分配缓冲区。 我认为问题在于您的缓冲区没有为空,因此请尝试使用 NULL 指针对其进行初始化

    char *buff=NULL;
    buff=getcwd(buff,PATH_MAX);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2016-02-04
    相关资源
    最近更新 更多