创建新指针后,getcwd()返回NULL

时间:2012-10-24 10:28:02

标签: c segmentation-fault getcwd

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

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

#include <unistd.h>
#include <stdio.h>
#include <limits.h>
main(){
char buff[PATH_MAX];
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");
        } 
    }

}

fclose(file);
}

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

3 个答案:

答案 0 :(得分:3)

buff指向随机记忆。

您可能愿意声明buff

char buff[PATH_MAX] = "";

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

char * currentDir = getcwd(NULL, 0);
完成后,

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

答案 1 :(得分:1)

删除该行:

  

自由(令牌);

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");
    }
...

答案 2 :(得分:0)

获取当前目录的小函数:

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();