我是这个论坛的新手,所以请耐心等待。
我目前正在编写一个程序,该程序将备份特定文件,并且每次备份时都会将日期和时间戳添加到文件名中。在这个阶段,我正在编写一个函数,该函数将识别当前工作目录中的所有文件,然后将其读入数组,稍后备份每个文件。备份工作正常。
我遇到的问题是,每次我尝试将文件夹名称传递给我的函数(作为字符串)时,我都会遇到段错误,调试器会给出以下错误:
程序收到信号 SIGSEGV,段错误。 backupAllFiles 中的 0x0000000000400b48 ( 目录名=) 在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] 的 strdup,但无济于事。
我感谢所有的帮助。 :)
附注会有一些不必要的额外包含,这是程序的其余部分,我懒得找到专门适用于该函数的内容。
最佳答案
只是将一些讨论概括为一个答案:这段代码至少存在两个问题。
在堆栈上声明
char allFiles[MAXPATHLEN][MAXPATHLEN]
会尝试分配比系统愿意允许的更多的内存,这就是为什么一旦代码输入backupAllFiles
。backupAllFiles
中的stat
调用会在初始化allFiles[numfiles]
元素之前对其进行访问。这大概应该是if(stat(dp->d_name, &stat_buffer) != 0)
而不是
if(stat(allFiles[numfiles], &stat_buffer) != 0)
感谢 @wildplasser 和 @Carl Norum 指出这里的根本问题实际上是堆栈溢出。
关于c - 将参数传递给函数时 C 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20315296/