运行我的C程序时在Linux中遇到分段错误
我正在尝试模拟中的命令。当我运行我的程序时,我得到了一个很好的结果 例如:运行我的C程序时在Linux中遇到分段错误,c,linux,simulation,C,Linux,Simulation,我正在尝试模拟中的命令。当我运行我的程序时,我得到了一个很好的结果 例如: ./a.out a > b a包含hello。我希望在b中复制hello 我的代码如下: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <string.h> int
./a.out a > b
a
包含hello。我希望在b
中复制hello
我的代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char *argv[])
{
int f, fd, r;
char buf[100];
if (argc < 2)
{
printf("Error");
return 0;
}
else
{
if (!strcmp(argv[2],">"))
{
f = open(argv[1],0,00777);
if (f == -1)
printf("no file");
else
{
fd = creat(argv[3],00777);
while( (r = read(f,buf,50)) > 0)
write(fd, buf, r);
}
}
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int f,fd,r;
char-buf[100];
如果(argc<2)
{
printf(“错误”);
返回0;
}
其他的
{
如果(!strcmp(argv[2],“>”))
{
f=打开(argv[1],000777);
如果(f==-1)
printf(“无文件”);
其他的
{
fd=creat(argv[3],00777);
而((r=read(f,buf,50))>0)
写入(fd、buf、r);
}
}
}
返回0;
}
为什么会出现分段错误
我有一个类似的程序,我以同样的方式打开并创建文件,该程序正在运行,但这一个给了我一个分段错误。这可能是因为重定向由shell而不是您的程序处理,所以
argv[2]
为NULL
并且argv[3]
不存在
但是,您应该使用调试器来找出真正发生的事情。然后添加正确的错误检查。这可能是因为重定向是由shell处理的,而不是由程序处理的,因此
argv[2]
为NULL
并且argv[3]
不存在
但是,您应该使用调试器来找出真正发生的事情。然后添加正确的错误检查。您可以在这里不使用
gdb
但您必须开始以结构化的方式解决问题:
- 不要认为任何事情都是理所当然的。例如,即使您将程序称为
,也不要假定program>file
与您假定的外观相同,而是通过输出每个参数来检查:argv
printf("argc: %d\n", argc); printf("argv[0]: %s\n", argv[0]); printf("argv[1]: %s\n", argv[1]); printf("argv[2]: %s\n", argv[2]); printf("argv[3]: %s\n", argv[3]); // the se can be expressed better with a for loop - but I'll leave that as an exercise for you
- 仅将您已验证的内容视为理所当然:如果您知道
,请不要访问argc>=2
和/或argv[2]
argv[3]
- 别说
if(argc<2) { printf("Error"); return 0; }
if(argc在这里,你可以不用
生活-但你必须开始以结构化的方式解决问题:gdb
- 不要认为任何事情都是理所当然的。例如,即使您将您的程序称为
,也不要假设program>文件
看起来与您假设的一样,而是通过输出它们中的每一个来检查:argv
printf("argc: %d\n", argc); printf("argv[0]: %s\n", argv[0]); printf("argv[1]: %s\n", argv[1]); printf("argv[2]: %s\n", argv[2]); printf("argv[3]: %s\n", argv[3]); // the se can be expressed better with a for loop - but I'll leave that as an exercise for you
- 仅将您已验证的内容视为理所当然:如果您知道
,请不要访问argc>=2
和/或argv[2]
argv[3]
- 别说
if(argc<2) { printf("Error"); return 0; }
发明的众多原因之一。@WhozCraig-现在,如果他们能够继续讨论gdb需要改进并变得更可用和友好的众多原因之一的话。不要浪费时间手工格式化代码;使用计算机程序。@Duck所有主要的IDE都对gdb有很好的支持,包括visual h处理调用堆栈和变量。然后在编译命令行args上结合使用如果(argcJoachim Pileborg的答案显然是正确的,那么就试着按照
./a.out a \> b
为了防止shell将“>”解释为重定向。
Joachim Pileborg的回答显然是正确的,只需将程序作为重定向运行即可./a.out a \> b
防止shell解释“>”作为重定向。
gdb
和gdb
将非常方便。发明-g
的众多原因之一。@WhozCraig-现在,如果他们能继续讨论gdb需要改进的众多原因之一,并且变得更可用和友好。不要浪费时间你的生活手工格式化代码;使用计算机程序。@Duck所有主要IDE都非常支持GDB,包括调用堆栈和变量的可视化处理。然后,gdb
与编译命令行args上的GDB
结合使用将非常方便。+1了解标准说明-g
保证为空(您可能不会惊讶于它被解释为未定义的频率)1.我一周前做了一个类似的程序,效果很好only@ashwinbhy然后它可能会工作,因为它是相似的。重定向和管道总是由shell处理。这几乎是一样的。在这里,我只检查我为“>>”制作的另一个程序中的一个条件等等。它在同一台电脑上运行良好。现在我正在比较两者。我使用了完全相同的东西,但这个程序不工作。实际上我不知道如何使用调试器。我对linux非常陌生。在明天的测试之前,我必须再执行20个程序,所以我暂时不谈这个问题。+1因为知道标准规定argv[argc]
保证为空(您可能不会感到惊讶的是,这被解释为未定义的频率有多高)1.我一周前做了一个类似的程序,效果很好only@ashwinbhy然后它可能会工作,因为它是相似的。重定向和管道总是由shell处理。这几乎是一样的。在这里,我只检查我为“>>”制作的另一个程序中的一个条件等等,它在同一台电脑上运行良好,现在我正在比较两者,我使用了完全相同的东西,但这个程序不工作,实际上我不知道如何使用调试器,我对linux非常陌生。我明天测试之前还要执行20多个程序,所以我现在就把它放在一边。我在想同样的事情,一个程序,这个简单的gdb,是杀伤力过大的,一些quick prints将隔离问题。我也在想同样的事情,一个程序这个简单的gdb是杀伤力过大的,几个快速打印将隔离问题。谢谢这项工作。我无法反驳我在早期的程序中给出的。/a.out a>b它在该程序中工作正常。但不在这个程序中,不是很奇怪吗。你的程序仍然是错误的,就像其他程序一样已经说过,在argc测试中。如果你想访问argv[argc]
- 不要认为任何事情都是理所当然的。例如,即使您将您的程序称为