纠正此分段错误

时间:2015-03-18 00:41:46

标签: c segmentation-fault

我在C中完成了这个例子,我的Debian(64位Kali)发行版一直在说这导致了一个分段错误并且不会运行它。我想解决这个问题,这样我就可以运行它并继续学习装配。这是我的命令:

gcc -ggdb -mpreferred-stack-boundary=2 -fno-stack-protector -o Simple SimpleDemo.c

来源:

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y)
{
    int z =10;

    z = x + y;
    return z;
}

main(int argc, char **argv)
{
    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    int c;
    char buffer[100];

    gets(buffer);
    puts(buffer);

    c = add(a,b);

    printf("Sum of %d+%d = %d\n",a, b, c);
    exit(0);
}

2 个答案:

答案 0 :(得分:2)

你提供了两个论点吗?程序需要它们,但不检查它们是否存在。如果你运行没有参数的程序,那可能会导致段错误。

如果这是一个严肃的例子,我会丢掉这本书,看看其他地方。 main()函数没有返回类型。它不检查程序参数。它有一个多余的缓冲区读写。它使用exit(),使用return是正常的。函数add()在写入之前为z赋值。以下是清理过的代码,但使用strtol()atoi()更好。

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y)
{
    int z = x + y;
    return z;
}

int main(int argc, char **argv)
{
    int a, b, c;
    if (argc < 3)
    {
        printf ("Need two arguments\n");
        return 1;
    }
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = add(a,b);
    printf("Sum of %d+%d = %d\n",a, b, c);
    return 0;
}

答案 1 :(得分:0)

the following is a method of writing the program.
it cleanly compiles/runs
is properly checks for the right number of command line parameters
it properly declares main() as returning int
it properly returns from main, rather than 
   calling exit() (which aborts the program)

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y)
{
    int z = x + y;

    return z;
} // end function: add


int main(int argc, char **argv)
{
    if( 3 != argc )
    {
        printf( "\nusage; %s value1 value2\n", argv[0] );
        exit( EXIT_FAILURE );
    }

    // implied else, correct number of parameters

    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    int c;
    char buffer[100];

    if( fgets(buffer, sizeof buffer, stdin) )
    { // then, fgets successful
        puts(buffer);
    }

    c = add(a,b);

    printf("Sum of %d+%d = %d\n",a, b, c);
    return 0;
} // end function: main