【问题标题】:Segmentation fault (core dumped) - argv - c分段错误(核心转储) - argv - c
【发布时间】:2020-09-18 06:51:53
【问题描述】:

我正在尝试为一个程序打开一个 txt 文件,该程序输入文件名作为命令行参数。如果我将路径作为字符串提供,它可以工作,所以我的代码中的问题在于命令行参数。我有以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char* filename = "/path/";
    char* name = argv[1];
    printf("%s\n", filename);
    printf("%s\n", name);
    strcat(filename, name);
    printf("%s\n", filename);
    strcat(filename, ".txt");
    printf("%s\n", filename);
    return 0;
}

我是这样运行的:

./program filenamewithoutextension

我运行它时得到以下输出:

/path/
filenamewithoutextension
Segmentation fault (core dumped)

我不明白发生了什么。

【问题讨论】:

  • char* filename = "/path/"; 这会将指针初始化为指向一个常量只读字符串。 strcat(filename, name); 这试图在前者的末尾附加另一个字符串。这会导致 UB(未定义的行为)就在那里。
  • 您需要注意字符数组的空间分配。您将 filename 声明为 char 数组,空格为 7(/path/ + NULL 终止符)。当您尝试将名称 strcat 到文件名上时,您正在写入超出分配的文件名长度,该长度应该是只读的。

标签: c segmentation-fault argv coredump


【解决方案1】:

请注意,在您的代码中 sn-p filenamename 只是指向只读数据的指针,因此您无法修改它们指向的数据。

您可以使用malloc 动态分配内存,以便能够编辑它们指向的数据。或者只是在堆栈中为它们分配内存,例如filename[100]name[100]

你的代码应该是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char filename[100]; 
    char name[100];
    strcpy(filename, "/path/");
    strcpy(name, argv[1]);
    printf("%s\n", filename);
    printf("%s\n", name);
    strcat(filename, name);//You can safely modify name now 
    printf("%s\n", filename);
    strcat(filename, ".txt");//You can safely modify filename now 
    printf("%s\n", filename);
    return 0;
}

【讨论】:

    【解决方案2】:

    char* filename = "/path/"; 在 C 中仍然被接受以考虑编写旧代码 在早期,const 关键字还不存在。
    但应该是const char *,因为这里的"/path/"其实是一个常数 字符串。
    -Wwrite-strings 编译器选项可以帮助检测到这一点)

    如果你想在这个字符串上附加一些东西,你需要更多的存储空间 关注字符。
    char filename[100]="/path/";
    在这种情况下,这 100 个字符是您的函数的本地字符,可以更改。
    它们以给定的字符开头,但后面跟着许多零(最多 100 个)。

    然后,在最后一个 / 之后放置一些新字符是有意义的。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2017-02-25
      • 2016-07-12
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多