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

时间:2013-12-01 17:53:58

标签: c segmentation-fault

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

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

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

编程接收信号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。会有额外的内容,这是不必要的,这是对于程序的其余部分,我太懒了,找不到专门适用于这个功能。

1 个答案:

答案 0 :(得分:0)

只是回顾一些讨论的答案:这段代码至少存在两个问题。

  1. 在堆栈上声明char allFiles[MAXPATHLEN][MAXPATHLEN]会尝试分配比系统允许的内存更多的内存,这就是代码进入backupAllFiles后立即引发分段错误的原因。

  2. stat中的backupAllFiles电话会在初始化之前访问allFiles[numfiles]元素。这应该是

    if(stat(dp->d_name, &stat_buffer) != 0)
    

    而不是

    if(stat(allFiles[numfiles], &stat_buffer) != 0)
    
  3. 感谢@wildplasser和@Carl Norum确定这里的根本问题是字面上的堆栈溢出。