opendir() 系统调用后指向 char 的指针发生变化
pointer to char changes after opendir() system call
我目前正在尝试使用 c 从系统调用中删除目录,但我遇到了一个奇怪的问题。在我的deleteFunction()
之后用char * path
打开目录。 path
的值更改
部分代码如下:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void deleteDir(char *path){
//opening the directory
printf("BEFORE %s\n",path );
DIR *p = opendir(path);
if (p == NULL){
printf("Directory not Opened!\n");
exit(2);
}
printf("AFTER %s\n",path );
}
void main(int argc,char *argv[]){
if (argc != 2){
printf("Not enough Arguments!\n");
exit(1);
}
//creating the path
char * currentDir = getcwd(NULL,0);
strcat(currentDir,"/");
strcat(currentDir,argv[1]);
//deleting the directory
deleteDir(currentDir);
exit(0);
}
产生的输出是:
BEFORE /home/tarounen/test/newfolder
AFTER /home/tarounen/test/!�
注意:我只是将目录名作为参数
getcwd
函数可能正在分配足够的 space 来保存当前路径,因此使用 strcat
添加更多字符会使缓冲区溢出,并导致未定义的行为。试试这个
char path[MAXPATHLEN];
getcwd( path, MAXPATHLEN );
strcat( path, "/" );
strcat( path, argv[1] );
getcwd
仅在您传递 NULL
.
时分配足够的内存来容纳目录
连接到它的结果有未定义的行为。
如果要使用strcat
,需要自己提供足够的缓冲区space:
char buffer[MAXPATHLEN] = {0};
if (getcwd(buffer, sizeof(buffer)))
{
strcat(buffer, "/");
strcat(buffer, argv[1]);
deleteDir(buffer);
}
我目前正在尝试使用 c 从系统调用中删除目录,但我遇到了一个奇怪的问题。在我的deleteFunction()
之后用char * path
打开目录。 path
的值更改
部分代码如下:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void deleteDir(char *path){
//opening the directory
printf("BEFORE %s\n",path );
DIR *p = opendir(path);
if (p == NULL){
printf("Directory not Opened!\n");
exit(2);
}
printf("AFTER %s\n",path );
}
void main(int argc,char *argv[]){
if (argc != 2){
printf("Not enough Arguments!\n");
exit(1);
}
//creating the path
char * currentDir = getcwd(NULL,0);
strcat(currentDir,"/");
strcat(currentDir,argv[1]);
//deleting the directory
deleteDir(currentDir);
exit(0);
}
产生的输出是:
BEFORE /home/tarounen/test/newfolder
AFTER /home/tarounen/test/!�
注意:我只是将目录名作为参数
getcwd
函数可能正在分配足够的 space 来保存当前路径,因此使用 strcat
添加更多字符会使缓冲区溢出,并导致未定义的行为。试试这个
char path[MAXPATHLEN];
getcwd( path, MAXPATHLEN );
strcat( path, "/" );
strcat( path, argv[1] );
getcwd
仅在您传递 NULL
.
时分配足够的内存来容纳目录
连接到它的结果有未定义的行为。
如果要使用strcat
,需要自己提供足够的缓冲区space:
char buffer[MAXPATHLEN] = {0};
if (getcwd(buffer, sizeof(buffer)))
{
strcat(buffer, "/");
strcat(buffer, argv[1]);
deleteDir(buffer);
}