分段错误(核心转储) - argv - c.



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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[])
{
char* filename = "/path/";
char* name = argv[1];
printf("%sn", filename);
printf("%sn", name);
strcat(filename, name);
printf("%sn", filename);
strcat(filename, ".txt");
printf("%sn", filename);
return 0;
}

我像这样运行它:

./program filenamewithoutextension

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

/path/
filenamewithoutextension
Segmentation fault (core dumped)

我不明白发生了什么。

请注意,在代码段中,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("%sn", filename);
printf("%sn", name);
strcat(filename, name);//You can safely modify name now 
printf("%sn", filename);
strcat(filename, ".txt");//You can safely modify filename now 
printf("%sn", filename);
return 0;
}
char* filename = "/path/";

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

如果要在此字符串中附加某些内容,则需要更多存储空间来 以下字符。
char filename[100]="/path/";在这种情况下,
100 个字符是函数的本地字符,可以更改。
它们以给定的字符开头,但后跟许多零(最多 100(。

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

最新更新