函数 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;
}
如果需要使用 malloc
和 free
,请将 #include <stdlib.h>
添加到代码的头部。
此处赋值
argv[1] = path;
这里不再有效
if(chdir(argv[1])<0) {
因为定义了path
的作用域({...}
), is valid 已经被留下了,所以argv[1]
指向了无效的内存。
调用 chdir()
然后访问这个无效内存,这反过来又引发了臭名昭着的未定义行为,从那时起任何事情都可能发生。
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;
}
如果需要使用 malloc
和 free
,请将 #include <stdlib.h>
添加到代码的头部。
此处赋值
argv[1] = path;
这里不再有效
if(chdir(argv[1])<0) {
因为定义了path
的作用域({...}
), is valid 已经被留下了,所以argv[1]
指向了无效的内存。
调用 chdir()
然后访问这个无效内存,这反过来又引发了臭名昭着的未定义行为,从那时起任何事情都可能发生。