【问题标题】:Segmentation Fault in C (gcc)C(gcc)中的分段错误
【发布时间】:2013-09-24 13:28:47
【问题描述】:

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

#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;
}

【问题讨论】:

  • i 让你越界了。试试i = strlen(argv[1]) - 1(请记住,C 中的数组是从零开始的)。
  • 你是如何运行它的?如果你不带参数运行它,argv[1] 将是NULL
  • @MarounMaroun 除了它没有越界 - 该指针指向终止 NUL 字节。
  • 检查所需的编号。 argc 中的参数。
  • 我会尝试 strlen(argv[1]) - 1,我怀疑你是否希望打印 '\0'。

标签: c gcc segmentation-fault


【解决方案1】:

您应该使用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
    }
}

【讨论】:

    【解决方案2】:
    1. 检查所需的编号。 argc 中的参数
    2. 一个字符串(char 数组)的元素从索引0length - 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;
    }    
    

    【讨论】:

    • 如果它有效,那不是意味着 printf("%c\n", '\0') 会出现段错误吗?因为看起来提问者有一个合适的 argv[1]。由于这些天我不在 C 上工作,因此无法对其进行测试。
    • @Lyth 不,printf("%c\n", '\0') 没有段错误。
    • 谢谢。所以 argv[1] 必须为空。
    【解决方案3】:

    如果argv[1] 的长度为 1 会怎样?

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

    【讨论】:

    • 这篇文章应该是评论
    • 这如何解释分段错误?
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2010-12-18
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多