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

标签 c segmentation-fault

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

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

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

程序收到信号 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,但无济于事。

我感谢所有的帮助。 :)

附注会有一些不必要的额外包含,这是程序的其余部分,我懒得找到专门适用于该函数的内容。

最佳答案

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

  1. 在堆栈上声明 char allFiles[MAXPATHLEN][MAXPATHLEN] 会尝试分配比系统愿意允许的更多的内存,这就是为什么一旦代码输入backupAllFiles

  2. 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/

相关文章:

c++ - 将 if 语句与指针一起使用时出现段错误(BST 树)

c++ - 嵌套文件夹调用的段错误

Django 崩溃 - 段错误 : 11 on macOS

C:共享内存和 fork ,打印语句执行多次

c - C 中 INT 的多维数组

c - 我怎样才能改变这个脚本

c - 如果我不说 int i=0 就会出现段错误

c - memcpy(dst, src, n) 之后的 free(src) 导致段错误

c - 将 int 值存储到 char p[] 索引中

c - 我在打字时遇到一些麻烦