在vprintf.c上进行分段

He-*_*Man 6 c unix gcc gdb

我是第二年的学生,仍然不像我想的那样精通编程.我们今年在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;

}
Run Code Online (Sandbox Code Playgroud)

这与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
Run Code Online (Sandbox Code Playgroud)

当我注释掉printf语句时,它会运行,但显然不会做我需要的.据我所知,这是printf语句的问题,但为什么呢?我查了一下,我收录了正确的标题.我很难想象vfprintf.c确实存在问题,因为这一切都发生在我学校的VM上.如果有人能给我一块骨头,我真的很感激.谢谢!

编辑,如您所见,我有错误的转换说明符.这就是整个问题.

War*_*ser 11

argc是一个整数,但你告诉printf我使用这种格式%s.

printf("\ncmdline args count=%s", argc);
Run Code Online (Sandbox Code Playgroud)

因为您使用过%s,printf将其argc作为内存地址的值处理,它尝试从中获取字符串中的字符,从而导致分段错误.

将格式更改为%d:

printf("\ncmdline args count=%d", argc);
Run Code Online (Sandbox Code Playgroud)