分段 vprintf.c
Segmentation on on vprintf.c
我是 CS 的二年级学生,仍然没有像我希望的那样精通编程。今年我们在 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 上编译得很好,但是当我 运行 它时,我得到了分段错误。我用 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 语句时,它 运行s,但显然不会做我需要它做的事情。据我所知,问题出在 printf 语句上,但为什么呢?我查了一下,我包括了正确的 header。我很难想象 vfprintf.c 实际上有什么问题,因为这一切都发生在我 ssh 进入的我学校的 VM 上。如果有人能给我一根骨头,我将不胜感激。谢谢!
编辑,如您所见,我的转换说明符有误。这就是全部问题。
argc
是一个整数,但你告诉 printf
使用格式 %s
.
printf("\ncmdline args count=%s", argc);
因为您使用了 %s
,printf
将 argc
的值视为内存地址,它试图从中获取字符串中的字符,这导致了分段错误.
将格式更改为 %d
:
printf("\ncmdline args count=%d", argc);
我是 CS 的二年级学生,仍然没有像我希望的那样精通编程。今年我们在 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 上编译得很好,但是当我 运行 它时,我得到了分段错误。我用 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 语句时,它 运行s,但显然不会做我需要它做的事情。据我所知,问题出在 printf 语句上,但为什么呢?我查了一下,我包括了正确的 header。我很难想象 vfprintf.c 实际上有什么问题,因为这一切都发生在我 ssh 进入的我学校的 VM 上。如果有人能给我一根骨头,我将不胜感激。谢谢!
编辑,如您所见,我的转换说明符有误。这就是全部问题。
argc
是一个整数,但你告诉 printf
使用格式 %s
.
printf("\ncmdline args count=%s", argc);
因为您使用了 %s
,printf
将 argc
的值视为内存地址,它试图从中获取字符串中的字符,这导致了分段错误.
将格式更改为 %d
:
printf("\ncmdline args count=%d", argc);