【发布时间】: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