分段错误(核心已转储)- argv - c
Segmentation fault (core dumped) - 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("%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)
我不明白发生了什么。
请注意,在您的代码片段中,filename
和 name
只是指向只读数据的指针,因此您无法修改它们指向的数据。
您可以使用 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;
}
char* filename = "/path/";
在 C 中仍然被接受以考虑编写旧代码
在早期,const
关键字还不存在。
但是应该是const char *
因为这里的"/path/"
其实是一个常量
字符串.
(-Wwrite-strings
编译器选项可以帮助检测这一点)
如果你想向这个字符串追加一些东西,你需要更多的存储空间
以下字符。
char filename[100]="/path/";
在这种情况下,这 100 个字符是您的函数的本地字符,可以更改。
它们以给定的字符开头,但后面跟着许多零(最多 100 个)。
然后,在最后一个 /
.
之后放置一些新字符是有意义的
我正在尝试为输入文件名作为命令行参数的程序打开一个 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)
我不明白发生了什么。
请注意,在您的代码片段中,filename
和 name
只是指向只读数据的指针,因此您无法修改它们指向的数据。
您可以使用 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;
}
char* filename = "/path/";
在 C 中仍然被接受以考虑编写旧代码
在早期,const
关键字还不存在。
但是应该是const char *
因为这里的"/path/"
其实是一个常量
字符串.
(-Wwrite-strings
编译器选项可以帮助检测这一点)
如果你想向这个字符串追加一些东西,你需要更多的存储空间
以下字符。
char filename[100]="/path/";
在这种情况下,这 100 个字符是您的函数的本地字符,可以更改。
它们以给定的字符开头,但后面跟着许多零(最多 100 个)。
然后,在最后一个 /
.