函数 chdir() 表现异常

Function chdir() is behaving weirdly

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 shell。但是当我输入

时,上面的代码是错误的

$ cd ~/code

它按预期执行,但在下面的情况下它说 "Not a valid path"。我想不通为什么。

$ cd ~/code/[name_of_some_valid_directory]

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

试试这个:

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;
}

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

此处赋值

argv[1] = path;

这里不再有效

if(chdir(argv[1])<0) {

因为定义了path的作用域({...}), is valid 已经被留下了,所以argv[1]指向了无效的内存。

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