我是第二年的学生,仍然不像我想的那样精通编程。我们今年在C中使用OS161。
对于这个问题,我应该编写一个C程序,它可以接受类似命令的命令并回显它们。好的,没问题。我以前用其他语言做过这个。这是我尝试过的代码:
#include <stdio.h>
int main (int argc, char *argv[]) {
int i = 0;
printf("\ncmdline args count=%s", argc);
/* First argument is executable name only */
printf("\nexe name=%s", argv[0]);
for (i=1; i< argc; i++) {
printf("\narg%d=%s", i, argv[i]);
}
printf("\n");
return 0;
}
这与gcc编译得很好,但是当我运行它时,我得到了Segmentation Fault。我用gdb运行它,这就是我得到的:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7abc493 in _IO_vfprintf_internal (s=0x7ffff7dd97a0, format=<value optimized out>,
ap=0x7fffffffe3f0) at vfprintf.c:1623
1623 vfprintf.c: No such file or directory.
in vfprintf.c
当我注释掉printf语句时,它会运行,但显然不会做我需要它做的事情。据我所知,这是printf语句的问题,但为什么呢?我查了一下,我收录了正确的标题。我很难想象vfprintf.c确实存在问题,因为这一切都发生在我学校的VM上。如果有人能给我一块骨头,我真的很感激。谢谢!
编辑,正如您所看到的,我有错误的转换说明符。这就是整个问题。
答案 0 :(得分:10)
argc
是一个整数,但您告诉printf
使用格式%s
。
printf("\ncmdline args count=%s", argc);
由于您使用了%s
,printf
将argc
的值视为内存地址,它尝试从中获取字符串中的字符,从而导致分段错误。< / p>
将格式更改为%d
:
printf("\ncmdline args count=%d", argc);