将参数传递给函数时C中的分段错误
我是新加入这个论坛的,所以请耐心等待 我目前正在编写一个程序,该程序将备份特定文件,每次备份时,都会在文件名中添加一个日期和时间戳。在此阶段,我正在编写一个函数,该函数将识别当前工作目录中的所有文件,然后将其读入数组,稍后将备份这些文件中的每个文件。备份工作正常 我遇到的问题是,每次尝试将文件夹名称(作为字符串)传递给函数时,我都会遇到分段错误,调试器会给出以下错误: 程序接收信号SIGSEGV,分段故障。 备份所有文件中的0x0000000000400b48( 正在处理的目录名=)c:52 五十二{ backupAllFiles()函数是在processing.c源文件(它是一个多源文件项目)中编写的。下面是主要关注的代码片段:将参数传递给函数时C中的分段错误,c,segmentation-fault,C,Segmentation Fault,我是新加入这个论坛的,所以请耐心等待 我目前正在编写一个程序,该程序将备份特定文件,每次备份时,都会在文件名中添加一个日期和时间戳。在此阶段,我正在编写一个函数,该函数将识别当前工作目录中的所有文件,然后将其读入数组,稍后将备份这些文件中的每个文件。备份工作正常 我遇到的问题是,每次尝试将文件夹名称(作为字符串)传递给函数时,我都会遇到分段错误,调试器会给出以下错误: 程序接收信号SIGSEGV,分段故障。 备份所有文件中的0x0000000000400b48( 正在处理的目录名=)c:52 五
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void backupAllFiles(char*dirname)
{
int numfiles=0;
char-allFiles[MAXPATHLEN][MAXPATHLEN];
DIR*dirp;
结构方向*dp;
dirp=opendir(dirname);
if(dirp==NULL)
{
fprintf(stderr,“无法打开:%s.\n”,dirname);
退出(退出失败);
}
而((dp=readdir(dirp))!=NULL)
{
结构统计缓冲区;
if(stat(所有文件[numfiles],&stat_buffer)!=0)
{
fprintf(stderr,“读取目录时出错:%s\n”,dirname);
}
else if(S_ISREG(stat_buffer.st_模式))
{
sprintf(所有文件[numfiles],“%s%s”,目录名,dp->d_名称);
}
numfiles++;
}
对于(int i=0;i
请注意,这还不是主程序的一部分,这只是一个单独的部分,用于单独测试
我真的很难理解为什么会发生segfault,我已经尝试了argv[1]的strdup,但是没有用
我感谢所有和任何帮助。:)
另外,还有一些不必要的额外包含,这是程序的其余部分,我太懒了,找不到哪一个会专门应用于此函数。只需将一些讨论重述到一个答案中:此代码至少有两个问题
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发现这里的根本问题是堆栈溢出。什么是
MAXPATHLEN
?您的堆栈溢出了吗?if(stat(allFiles[numfiles],&stat_buffer)!=0)
此时allFiles[]仍然未初始化。MAXPATHLEN是一个在其中一个标头中提供的常量#include它只是限制任何文件位置的最大路径长度。函数中的所有文件都已在前面初始化,segfault甚至在任何初始化完成之前发生,我使用了fprintf(stderr,“Started function backupAllFiles\n”)作为函数的第一行,它永远不会到达它,它会在此点之前终止程序。函数中的所有文件都已在前面初始化,
在哪一行?