我是这个论坛的新手,所以请耐心等待。
我目前正在编写一个程序来备份特定文件,每次备份时都会在文件名中添加日期和时间戳。在这个阶段,我正在编写一个函数,它将识别当前工作目录中的所有文件,然后将其读入一个数组,稍后将备份每个文件。备份工作正常。
我遇到的问题是,每次我尝试将文件夹名称传递给我的函数(作为字符串)时,调试器会出现分段错误:
编程接收信号SIGSEGV,分段故障。 backupAllFiles中的0x0000000000400b48( dirname =)at processing.c:52 52 {
backupAllFiles()函数写在processing.c源文件中(它是一个多源文件项目)。以下是主要关注的代码片段:
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <getopt.h>
void backupAllFiles(char *dirname)
{
int numfiles = 0;
char allFiles[MAXPATHLEN][MAXPATHLEN];
DIR *dirp;
struct dirent *dp;
dirp = opendir(dirname);
if(dirp == NULL)
{
fprintf(stderr, "Could not open: %s.\n",dirname);
exit(EXIT_FAILURE);
}
while((dp = readdir(dirp)) != NULL)
{
struct stat stat_buffer;
if(stat(allFiles[numfiles], &stat_buffer) != 0)
{
fprintf(stderr,"An error occurred while reading the directory: %s\n",dirname);
}
else if(S_ISREG(stat_buffer.st_mode))
{
sprintf(allFiles[numfiles], "%s%s", dirname, dp->d_name);
}
numfiles++;
}
for(int i = 0; i < numfiles; i++)
{
fprintf(stderr,"All the files are (%i) %s.\n",i ,allFiles[i]);
}
}
int main(int argc, char *argv[])
{
fprintf(stderr, "Entered main, passing argument %s to backupAllFiles()\n",argv[1]);
backupAllFiles(argv[1]);
return 0;
}
请注意,这不是主程序的一部分,这只是一个用于单独测试的独立段。
我真的很难过为什么会发生段错误而且我已经尝试过argv [1],但无济于事。
我感谢所有人和任何帮助。 :)
P.S。会有额外的内容,这是不必要的,这是对于程序的其余部分,我太懒了,找不到专门适用于这个功能。
答案 0 :(得分:0)
只是回顾一些讨论的答案:这段代码至少存在两个问题。
在堆栈上声明char allFiles[MAXPATHLEN][MAXPATHLEN]
会尝试分配比系统允许的内存更多的内存,这就是代码进入backupAllFiles
后立即引发分段错误的原因。
stat
中的backupAllFiles
电话会在初始化之前访问allFiles[numfiles]
元素。这应该是
if(stat(dp->d_name, &stat_buffer) != 0)
而不是
if(stat(allFiles[numfiles], &stat_buffer) != 0)
感谢@wildplasser和@Carl Norum确定这里的根本问题是字面上的堆栈溢出。