【问题标题】:How to fix segment Fault Error in Terminal?如何修复终端中的段故障错误?
【发布时间】:2018-02-04 21:30:31
【问题描述】:

Output of the program

我正在尝试编译我的代码,我觉得它工作得很好,我可以编译它。但是,当我这样做时,我收到段错误错误,我看不到代码中的错误在哪里。

我得到的错误是 Segment fault: 11 我已经查过了,我知道它与内存分配有关,但无法在代码中找到我需要修复我的内存分配并修复我在这里遇到的错误。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

/*The Main Function Start*/
void main(int argc, char *argv[])
{
    /*Storing The Process Id*/
    pid_t pid;
    int j;
    int status = 0;


    /*process of forking*/

    if (argc == 1){
        fprintf(stderr,"Usage: ./hw1 <starting value>\n");
    }
    int n = atoi(argv[1]);
    pid=fork();
    if (pid == -1){
        printf("Error in forking....\n");
        exit(0);
    }
    /*Child process*/
    if (pid == 0)
    {
        printf("Child PID: %d\n",getpid());

        while (n != 1){
            printf("%d ",n);
            if (n % 2 == 0){
                n = n/2;
            }
            else {
                n = 3*n + 1;
            }

        }
        printf("1\n");
    }
    else{
        printf("Parent PID: %d\n",getpid());
        /*Waiting for the child to finish*/
        wait(0);
    }
    exit(0);
}

【问题讨论】:

  • 当你在没有任何参数的情况下调用它时,你会得到一个segfault,因为你在打印到stderr 之后没有exitreturnatoi(argv[1]) 是我之前所说的问题。
  • 请不要发布终端输出的图片,只需复制并粘贴终端的输出并将其发布到您的代码中。

标签: c linux segmentation-fault


【解决方案1】:

当我没有传递任何参数时,我只会得到一个段错误,因为

int n = atoi(argv[1]);

基本上是atoi(NULL),因为argv[1] 将是NULL

if (argc != 2){
        fprintf(stderr, "usage: %s <starting value>\n", argv[0]);
        return 1; // <- you forgot this!
}

用不同的值调用你的程序不会导致段错误,我已经 尝试了不同的数字。

另一个错误:main 函数应该定义为:

  • int main(void);
  • int main(int argc, char *argv[]);
  • int main(int argc, char **argv);

你应该改变它。见What should main() return in C and C++?

一般信息。如果你想退出 void 函数,你有 要做的是使用 return; 没有任何值,像这样:

void foo(void)
{
    do_some_work();

    if(should_i_terminate)
        return;

    keep_doing_work();
}

【讨论】:

  • 我现在收到了
  • void function 'main' 不应返回值
  • @black main 不应该是 void,我错过了那个错误。
  • @black:请参阅What should main() return in C and C++? 了解肮脏的细节。一般来说,void main() 是一个错误。
  • if (argc != 2) 会更可靠
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2019-08-29
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
相关资源
最近更新 更多