更正此分段错误

Correcting this 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);
}

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

如果这是一个严肃的例子,我会扔掉这本书,去别处看看。 main() 函数没有 return 类型。它不检查程序参数。它有一个多余的缓冲区读写。它在通常使用 return 的地方使用 exit()。函数 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;
}
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