【问题标题】:my C program is crashing我的 C 程序崩溃了
【发布时间】:2014-04-17 05:56:20
【问题描述】:

这是一个简单的程序,输入两个数字,打印出来,然后使用

函数 alter 改变 x 和 y 并在 main 中打印出来,但由于某种原因它

不会打印出“输入两个数字”,但我还是可以输入两个数字

输入第二个号码后它崩溃了,谁能告诉我我做错了什么?

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

main()
{
  int x, y;
  puts("Enter two numbers ");
  scanf("%d",&x);
  scanf("%d",&y);
  void alter(int*,int*);

  printf("Before alter x = %d  y = %d\n",x,y);
  alter(x,y);
  printf("After alter x = %d  y = %d\n",x,y);
}
void alter(int* x, int* y)
{
  *x = *x+*y;
  *y = *x**y;
}

【问题讨论】:

  • 您确实需要启用编译器警告并注意它们 - 编译器会警告您调用 alter 时的错误,这将为您节省大量时间和精力。

标签: c function crash


【解决方案1】:

函数alter()有两个整数pointersparameter。所以,当你调用这个函数时,你必须给两个地址作为参数,否则会出现runtime error,这就是你的程序崩溃的原因。你应该写:

 alter(&x,&y);

而不是

 alter(x,y)

因为你的函数的参数是:

 int* x, int* y

【讨论】:

    【解决方案2】:

    改变

    puts("Enter two numbers ");
    

    puts("Enter two numbers \n");
    

    \n 刷新输出流,以便在控制台上打印字符串。

    改变

    alter(x,y);
    

    alter(&x,&y);
    

    因为您的函数采用 int * 而不是 int

    【讨论】:

    • 成功了,但是“输入两个数字”在输入两个数字之后仍然出现,而不是在输入之前出现
    【解决方案3】:

    当你编译你的代码时。编译器会针对您的问题发出警告

    user1.c: In function ‘main’:
    user1.c:13:3: warning: passing argument 1 of ‘alter’ makes pointer from integer without a cast
    user1.c:10:8: note: expected ‘int *’ but argument is of type ‘int’
    user1.c:13:3: warning: passing argument 2 of ‘alter’ makes pointer from integer without a cast
    user1.c:10:8: note: expected ‘int *’ but argument is of type ‘int’
    

    总是查看编译器警告。它将帮助您克服此类问题。

    这里的 alter() 将指针作为参数,你通过值变量传递,所以会崩溃

    改正为

    alter(&x,&y);
    

    【讨论】:

      【解决方案4】:
      alter(x,y);
      

      应该是

      alter(&x,&y);
      

      【讨论】:

        【解决方案5】:

        由于您使用的是传递变量地址而不是其值的指针,因此您必须将xy 的地址发送到void alter(int* x, int* y) 而不是xy 本身的值。所以将函数调用从alter(x,y);(将值传递给被调用函数)更改为alter(&amp;x,&amp;y);(仅将变量xy的地址传递给指针)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-18
          • 2016-01-18
          • 2014-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多