首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数chdir()行为怪异

函数chdir()行为怪异
EN

Stack Overflow用户
提问于 2015-10-01 14:49:36
回答 2查看 214关注 0票数 0
代码语言:javascript
复制
int cmd_cd(char* argv[]) {
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      char path[strlen(pw->pw_dir) + strlen(arg[1])];
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    return -1;
  }
  return 0;
}

上面是一个代码片段,我试图在其中制作一个玩具linux外壳。但是上面的代码是错误的,就像我键入

$ cd ~/代码

它按预期执行,但在下面的情况下,它表示“不是一个有效的路径”。我不知道为什么。

$ cd ~/code/name_of_some_目录

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-01 14:59:26

path在退出定义的块时被删除。

试试这个:

代码语言:javascript
复制
int cmd_cd(char* argv[]) {
  char *path = NULL;
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
      if (path == NULL){
        printf("Memory allocation failed\n");
        return -1;
      }
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    if (path != NULL) free(path);
    return -1;
  }
  if (path != NULL) free(path);
  return 0;
}

如果需要使用#include <stdlib.h>free,请将malloc添加到代码头。

票数 3
EN

Stack Overflow用户

发布于 2015-10-01 15:01:50

在此分配的值

代码语言:javascript
复制
argv[1] = path;

在这里不再有效了

代码语言:javascript
复制
if(chdir(argv[1])<0) {

由于定义了{...}的作用域( path )是有效的,所以argv[1]指向无效内存。

然后,对chdir()的调用访问这个无效的内存,这反过来又会引发臭名昭著的未定义行为,从那时起,任何事情都可能发生。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32890567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档