【问题标题】:I am getting a segmentation fault while creating a program of multiplication table [closed]创建乘法表程序时出现分段错误[关闭]
【发布时间】:2018-08-12 06:23:33
【问题描述】:
#include<stdio.h>

main()
{
    int x,y,z;
    z=x*y;

    10<x<20,y<10;

    x=rand()%20;
    y=rand()%10;
    printf("%2d",x);
    printf("%2d",y);
    printf("enter value of z");
    scanf("%d",z);

    if(z=x*y)
    {
       printf("correct");
    }
    else
      printf("wrong no. entered");
}

我收到分段错误错误,请帮助。

【问题讨论】:

  • 除了分段错误之外还有一些问题...
  • 您的源代码开头似乎有一些随机的、毫无意义的行。此外,您的缩进很差,(即缺失),这使得您的源代码难以阅读和遵循:(
  • 重复文本以避免 SO 限制是不友好的:(
  • @sg7 谢谢,我正要这样做。
  • @IharobAlAsimi 欢迎您!

标签: c linux segmentation-fault


【解决方案1】:

分段错误是因为您使用 z 值而不是指向它的指针调用 scanf()

scanf() 遇到"%d" 说明符时,它需要一个指向int 的指针来将结果值存储在那里,你传递了一个int,而不是一个甚至没有初始化的,所以scanf() 将取消引用一个未指向有效内存的指针,从而导致 SEGMENTATION FAULT

但这不是你的代码的唯一问题,事实上,这么小的代码有很多问题:

  1. main() 的签名必须是以下之一

    • int main(void)
    • int main(int argc, char **argv) 或等效的 int main(int argc, char *argv[])
  2. 您的代码格式确实很糟糕,即使这不是它表现不佳的原因,也值得担心。

  3. 您使用 xy 时没有先初始化它们,这是未定义的行为

  4. 此声明

    10 < x < 20 , y < 10;
    

    什么都不做。

  5. 您没有包含rand() 原型所需的stdlib.h

  6. 你做了上面解释的 scanf() 所做的事情。

  7. if (z = x * y) 将简单地将x * y 分配给z,除非xy0)计算结果为真。

    中的比较运算符是==

您的代码应该类似于以下内容

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

int
main(void)
{
    int x, y, z;

    x = rand() % 20;
    y = rand() % 10;

    printf("%2d", x);
    printf("%2d", y);

    printf("enter value of z ");
    if (scanf("%d", &z) == 1) {
        if (z == x * y) {
            printf("correct\n");
        } else {
            printf("error\n");
        }
    }
    return 0;
}

【讨论】:

  • 那该怎么办呢?
  • 代码不全有问题!
  • @WeatherVane 不,当然。写了很多,花时间。
  • z = x * y 看起来很奇怪。第一个是乘以未初始化的贵重物品。第二个可以与所需的比较一起使用。
  • 还有什么问题?
猜你喜欢
  • 2019-03-27
  • 2021-07-18
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多