gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:43:05 27 4
gpt4 key购买 nike

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

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

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

程序收到信号 SIGSEGV,段错误。backupAllFiles 中的 0x0000000000400b48 ( 目录名=) 在processing.c:5252 {

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com