Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vprintf.c上的分段_C_Unix_Gcc_Gdb - Fatal编程技术网

vprintf.c上的分段

vprintf.c上的分段,c,unix,gcc,gdb,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); /* Fir

我是一名计算机科学二年级的学生,在编程方面还不如我想的那么精通。今年我们将在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;

}
#包括
int main(int argc,char*argv[]){
int i=0;
printf(“\ncmdline args count=%s”,argc);
/*第一个参数仅为可执行文件名*/
printf(“\nexe name=%s”,argv[0]);
对于(i=1;i
这在gcc中编译得很好,但是当我运行它时,我会发现分段错误。我用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
程序接收信号SIGSEGV,分段故障。
0x00007FF7ABC493输入输出vfprintf_内部(s=0x7ffff7dd97a0,格式=,
在vfprintf.c:1623处,ap=0x7fffffffe3f0)
1623 vfprintf.c:没有这样的文件或目录。
在vfprintf.c中
当我注释掉printf语句时,它会运行,但显然不会执行我需要的操作。就我所知,问题出在printf语句上,但为什么呢?我查了一下,包括了右边的标题。我很难想象vfprintf.c实际上有什么问题,因为这一切都发生在我用ssh连接到的学校虚拟机上。如果有人能扔我一根骨头,我会非常感激的。谢谢


编辑,如您所见,我使用了错误的转换说明符。这就是问题所在。

argc
是一个整数,但您告诉
printf
使用
%s
格式

printf("\ncmdline args count=%s", argc);
由于您使用了
%s
printf
argc
的值视为一个内存地址,它试图从中提取字符串中的字符,这导致了分段错误

将格式更改为
%d

printf("\ncmdline args count=%d", argc);

哎呀,我觉得自己很笨。非常感谢!我的gcc在违规线路上给了我警告。你的不是吗?如果你打开
-Wall
?@Nate Eldredge我没有收到任何警告。我不熟悉-墙,我以后肯定会用它,谢谢。