将参数传递给函数时C中的分段错误

将参数传递给函数时C中的分段错误,c,segmentation-fault,C,Segmentation Fault,我是新加入这个论坛的,所以请耐心等待 我目前正在编写一个程序,该程序将备份特定文件,每次备份时,都会在文件名中添加一个日期和时间戳。在此阶段,我正在编写一个函数,该函数将识别当前工作目录中的所有文件,然后将其读入数组,稍后将备份这些文件中的每个文件。备份工作正常 我遇到的问题是,每次尝试将文件夹名称(作为字符串)传递给函数时,我都会遇到分段错误,调试器会给出以下错误: 程序接收信号SIGSEGV,分段故障。 备份所有文件中的0x0000000000400b48( 正在处理的目录名=)c:52 五

我是新加入这个论坛的,所以请耐心等待

我目前正在编写一个程序,该程序将备份特定文件,每次备份时,都会在文件名中添加一个日期和时间戳。在此阶段,我正在编写一个函数,该函数将识别当前工作目录中的所有文件,然后将其读入数组,稍后将备份这些文件中的每个文件。备份工作正常

我遇到的问题是,每次尝试将文件夹名称(作为字符串)传递给函数时,我都会遇到分段错误,调试器会给出以下错误:

程序接收信号SIGSEGV,分段故障。 备份所有文件中的0x0000000000400b48( 正在处理的目录名=)c: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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
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”)作为函数的第一行,它永远不会到达它,它会在此点之前终止程序。
    函数中的所有文件都已在前面初始化,
    在哪一行?