繁体   English   中英

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

[英]Segmentation fault in C when passing argument to a function

我是这个论坛的新手,请多多包涵。

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

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

程序收到信号SIGSEGV,分段故障。 备份中的backupAllFiles(dirname =)中的0x0000000000400b48.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了,但是无济于事。

我感谢所有帮助。 :)

PS会有多余的东西是不必要的,这对于程序的其余部分来说,我懒得找到哪一个东西专门适用于此功能。

只是为了将一些讨论概括为一个答案:此代码至少存在两个问题。

  1. 在堆栈上声明char allFiles[MAXPATHLEN][MAXPATHLEN]尝试分配超出系统允许范围的内存,这就是为什么一旦代码进入backupAllFiles就会引发分段错误的原因。

  2. backupAllFilesstat调用在初始化之前访问allFiles[numfiles]元素。 这应该是

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

    而不是

     if(stat(allFiles[numfiles], &stat_buffer) != 0) 

感谢@wildplasser和@Carl Norum来确定这里的根本问题实际上是堆栈溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM