Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C语言中的分段错误(gcc)_C_Gcc_Segmentation Fault - Fatal编程技术网

C语言中的分段错误(gcc)

C语言中的分段错误(gcc),c,gcc,segmentation-fault,C,Gcc,Segmentation Fault,它编译得很好,但是当我试着运行程序时,我得到了一个分段错误。我不确定哪里出了错 #include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc, char ** argv) { int i, childpid; for (i = strlen(argv[1]); i >= 0; i --) { if (fork() == 0) {

它编译得很好,但是当我试着运行程序时,我得到了一个分段错误。我不确定哪里出了错

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char ** argv)
{
    int i, childpid;


for (i = strlen(argv[1]); i >= 0; i --) {
    if (fork() == 0) {
        printf("%c\n",argv[1][i]);
        break;
    }
}    
    return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
inti,childpid;
对于(i=strlen(argv[1]);i>=0;i--){
如果(fork()==0){
printf(“%c\n”,argv[1][i]);
打破
}
}    
返回0;
}

如果
argv[1]
是长度1,会发生什么


在第一个循环中,
i
将是1,但
argv[1][1]
是一个字符长字符串的终止null。

您应该使用
argc
参数来知道从命令行发送了多少个参数。在运行
for
语句之前,测试它是否大于1,因为您的第一个参数将是程序名:

if (argc > 1) {
    for (i = strlen(argv[1]) - 1; i >= 0; i --) {
        if (fork() == 0) {
            printf("%c\n",argv[1][i]);
            break;
        }
    }
}
或者,如果您只想打印第一个字符,您可以这样做

if(argc > 1) {
    if(strlen(argv[1]) > 0 && fork() == 0) {
        printf("%c\n",argv[1][0]);
    } else {
        // for loop here
    }
}

  • 检查
    argc
  • 字符串(
    char
    array)的元素从索引
    0
    length-1
  • 代码:

    int main(int argc,char**argv)
    {
    inti,childpid;
    如果(argc<2){
    printf(“缺少参数\n”);
    返回-1;
    }
    对于(i=strlen(argv[1])-1;i>=0;i--){
    如果(fork()==0){
    printf(“%c\n”,argv[1][i]);
    打破
    }
    返回0;
    }    
    
    i
    让你出界了。请尝试
    i=strlen(argv[1])-1
    (记住C中的数组是以零为基的)。如何运行它?如果不带参数运行它,
    argv[1]
    将为
    NULL
    @MarounMaroun,除非它不超出范围-指针指向终止的NUL字节。请检查
    argc
    中所需的参数数量。我将尝试strlen(argv[1])-1,我怀疑您是否希望打印“\0”。这篇文章应该是评论,这如何解释分段错误?如果它起作用,这难道不意味着printf(“%c\n”,“\0”)有seg错误吗?因为询问者似乎有一个正确的argv[1]。无法测试它,因为我这些天没有在c上工作。@Lyth否,
    printf(“%c\n”,“\0”)
    没有seg错误。谢谢。因此argv[1]必须为空。
    int main(int argc, char ** argv)
    {
        int i, childpid;
    
        if(argc < 2) {
            printf("An argument is missing\n");
            return -1;
        }
    
        for (i = strlen(argv[1]) - 1; i >= 0; i --) {
            if (fork() == 0) {
            printf("%c\n",argv[1][i]);
            break;
        }
    
        return 0;
    }