これは、正常にコンパイルされますが、実行時にセグメンテーション違反が発生するコードの一部です。この問題を回避する方法を誰か教えてください。コードは C で rm システム コールを実装しています。
#include<sys/stat.h>
#include<unistd.h>
#include<dirent.h>
#include<error.h>
#include <stdio.h>
#include <string.h>
int rmq(char*pth)
{
char path[1000]; //hold the file name to be removed
strcpy(path,pth);
char *b; // stores the complete path of the file to be removed
struct dirent *d;
DIR *dir;
char cwd[256]; //holds current working directory
getcwd(cwd, sizeof(cwd));
dir = opendir(cwd);
char path1[1000]; //for recursively moving through dir and subdir
strcpy(path1,cwd);
char newp[1000];
struct stat buf;
while((d = readdir(dir))) //if there are directories to be read
{
if(!strcmp(d->d_name,".") || !strcmp(d->d_name,"..")) // skip "." and ".."
continue;
//appends directory read to cwd
strcpy(newp,path1);
strcat(newp,"/");
strcat(newp,d->d_name);
//printf("%s>>",d->d_name);
if(stat(newp,&buf)==-1) // puts file info in buf
perror("stat");
if(S_ISDIR(buf.st_mode))// if directory, then add a "/" to current path
{
//if a directory then call function again(recursion)
strcat(path1,"/");
strcat(path1,d->d_name);
rmq(path1);
}
else{
//if directory current read is the one to be removed
if((strcmp(path, d->d_name)) == 0){
// append it with cwd & put it in b
b = malloc(25 + strlen(d->d_name) + 1);
sprintf(b, "%s/%s", "/home/urwa/Documents/OPS", d->d_name);
remove(b); // remove that file
free(b);
}
}
}
return 0;
}
int main(){
char cwd[256];
getcwd(cwd, sizeof(cwd));
char *argv[2];
argv[1] = "dumbledore.txt";
rmq(argv[1]); // file to be removed is passed as parameter
return 0;
}
私はmallocを試しましたが、問題は解決しませんでした