在opendir()系统调用之后指向char的指针

时间:2015-02-24 20:36:32

标签: c linux system-calls opendir

我目前正在尝试使用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/!�

注意:我只将目录名称作为参数

2 个答案:

答案 0 :(得分:3)

getcwd函数可能正在分配足够的空间来保存当前路径,因此添加更多带有strcat的字符会溢出缓冲区,并导致未定义的行为。试试这个

char path[MAXPATHLEN];
getcwd( path, MAXPATHLEN );
strcat( path, "/" );
strcat( path, argv[1] );

答案 1 :(得分:3)

传递getcwd时,

NULL仅分配足够的内存来保存目录 连接到它的结果有不确定的行为。

如果您想使用strcat,您需要为自己的缓冲区提供足够的空间:

char buffer[MAXPATHLEN] = {0};
if (getcwd(buffer, sizeof(buffer)))
{
    strcat(buffer, "/");
    strcat(buffer, argv[1]);
    deleteDir(buffer);
}