C 为什么我收到分割错误:11

C 为什么我收到分割错误:11,c,function,pointers,segmentation-fault,C,Function,Pointers,Segmentation Fault,这个程序应该起到复数计算器的作用。我需要在给定参数下使用这些函数。当我运行程序时,我可以在选择操作后输入4个数字。就在我按下第四个数字的enter键之后,我收到一个名为“分段错误:11”的错误。我不知道为什么我会收到这个消息 我已经包括了代码 #include <stdio.h> #include <math.h> #include <stdlib.h> void read_num(float *real_part, float *imaginary_par

这个程序应该起到复数计算器的作用。我需要在给定参数下使用这些函数。当我运行程序时,我可以在选择操作后输入4个数字。就在我按下第四个数字的enter键之后,我收到一个名为“分段错误:11”的错误。我不知道为什么我会收到这个消息

我已经包括了代码

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

void read_num(float *real_part, float *imaginary_part) {
    float realnumberholder, imagnumberholder;
    printf("Please type in the real component: ");
    scanf("%f", &realnumberholder);
    *real_part = realnumberholder;
    printf("Please type in the imaginary component: ");
    scanf("%f", &imagnumberholder);
    *imaginary_part = imagnumberholder;
}

void read_nums(float *real_part_1, float *imaginary_part_1,
               float *real_part_2, float *imaginary_part_2)   {
    printf("Reading the first imaginary number...");
    read_num(real_part_1, imaginary_part_1);
    printf("Reading the second imaginary number...");
    read_num(real_part_2, imaginary_part_2);
}

void print_complex(float real_part, float imaginary_part) {
    printf("The operation yields %6.3f + %6.3fi", real_part,
           imaginary_part);
}

void add(float real_part_1, float imaginary_part_1, float
         real_part_2, float imaginary_part_2, float *real_result, float
         *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 + real_part_2);
    *imaginary_result = (imaginary_part_1 + imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

void subtract(float real_part_1, float imaginary_part_1, float
              real_part_2, float imaginary_part_2, float *real_result, float
              *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 - real_part_2);
    *imaginary_result = (imaginary_part_1 - imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

void multiply(float real_part_1, float imaginary_part_1, float
              real_part_2, float imaginary_part_2, float *real_result, float
              *imaginary_result) {
    read_nums(&real_part_1, &imaginary_part_1, &real_part_2,
              &imaginary_part_2);
    *real_result = (real_part_1 * real_part_2);
    *imaginary_result = (imaginary_part_1 * imaginary_part_2);
    print_complex(*real_result, *imaginary_result);
}

int main()
{
    int option;
    float realone = 0;
    float imaginaryone = 0;
    float realtwo = 0;
    float imaginarytwo = 0;
    float *realresult;
    float *imaginaryresult;


    printf("\nComplex Number Arithmetic Program.\n");
    printf("1) Add two complex numbers\n2) Subtract two complex
           numbers\n3) Multiply two complex number\n4) Quit\nChoose an
           option (1-4): ");
    scanf("%d", &option);

    while(option != 4) {

        switch(option) {
        case 1 :
            add(realone, imaginaryone, realtwo,
                imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        case 2 :
            subtract(realone, imaginaryone, realtwo,
                     imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        case 3 :
            multiply(realone, imaginaryone, realtwo,
                     imaginarytwo, realresult, imaginaryresult);
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        default:
            printf("Please input a valid menu
                   option\n");
            printf("1) Add two complex numbers\n2)
                   Subtract two complex numbers\n3) Multiply
                   two complex number\n4) Quit\nChoose an
                   option (1-4): ");
            scanf("%d", &option);
            break;
        }
    }

    if (option == 4) {
        printf("Bye!\n");
        return 0;
    }

}
#包括
#包括
#包括
无效读取数(浮点*实部,浮点*虚部){
float realmumberholder、imagnumberholder;
printf(“请输入真实组件:”);
scanf(“%f”和realnumberholder);
*实数部分=实数文件夹;
printf(“请输入虚部:”);
scanf(“%f”和imagnumberholder);
*虚部=imagnumberholder;
}
无效读数值(浮点*实部\ 1,浮点*虚部\ 1,
浮点*实部\ u2,浮点*虚部\ u2){
printf(“读取第一个虚数…”);
read_num(实部_1,虚部_1);
printf(“读取第二个虚数…”);
read_num(实部_2,虚部_2);
}
无效打印复合(浮点实部、浮点虚部){
printf(“该操作产生%6.3f+%6.3fi”),实部,
虚部);
}
虚加(浮点实部,浮点虚部,浮点
实部2,浮点虚部2,浮点*实部结果,浮点
*假想结果){
阅读nums(&real\u part\u 1,&virtual\u part\u 1,&real\u part\u 2),
&虚部(2);
*实数结果=(实数部分1+实数部分2);
*虚部结果=(虚部结果1+虚部结果2);
打印复数(*实结果,*虚结果);
}
空减法(浮点实部,浮点虚部,浮点
实部2,浮点虚部2,浮点*实部结果,浮点
*假想结果){
阅读nums(&real\u part\u 1,&virtual\u part\u 1,&real\u part\u 2),
&虚部(2);
*真实结果=(真实部分1-真实部分2);
*虚部结果=(虚部结果1-虚部结果2);
打印复数(*实结果,*虚结果);
}
空乘(浮点实部,浮点虚部,浮点
实部2,浮点虚部2,浮点*实部结果,浮点
*假想结果){
阅读nums(&real\u part\u 1,&virtual\u part\u 1,&real\u part\u 2),
&虚部(2);
*实际结果=(实际部分1*实际部分2);
*虚部结果=(虚部结果1*虚部结果2);
打印复数(*实结果,*虚结果);
}
int main()
{
int选项;
float realone=0;
浮点数1=0;
float realtwo=0;
浮点数2=0;
浮动*真实结果;
浮动*想象结果;
printf(“\n复数算术程序。\n”);
printf(“1)加两个复数\n2)减去两个复数
数字\n3)两个复数相乘\n4)退出\n选择一个
选项(1-4):“”;
scanf(“%d”,选项(&O);
while(选项!=4){
开关(选件){
案例1:
添加(realone、imaginaryone、Realtw、,
想象二,真实结果,想象结果);
printf(“1)添加两个复数\n2)
减去两个复数\n3)相乘
两个复数\n4)退出\n选择一个
选项(1-4):“”;
scanf(“%d”,选项(&O);
打破
案例2:
减法(实一,虚一,实二,
想象二,真实结果,想象结果);
printf(“1)添加两个复数\n2)
减去两个复数\n3)相乘
两个复数\n4)退出\n选择一个
选项(1-4):“”;
scanf(“%d”,选项(&O);
打破
案例3:
乘,
想象二,真实结果,想象结果);
printf(“1)添加两个复数\n2)
减去两个复数\n3)相乘
两个复数\n4)退出\n选择一个
选项(1-4):“”;
scanf(“%d”,选项(&O);
打破
违约:
printf(“请输入有效的菜单
选择权;
printf(“1)添加两个复数\n2)
减去两个复数\n3)相乘
两个复数\n4)退出\n选择一个
选项(1-4):“”;
scanf(“%d”,选项(&O);
打破
}
}
如果(选项==4){
printf(“再见!\n”);
返回0;
}
}
更改此选项

float *realresult;
float *imaginaryresult;
为此:

float realresult;
float imaginaryresult;
然后更改函数调用以获取地址:

add(realone, imaginaryone, realtwo,
            imaginarytwo, &realresult, &imaginaryresult);
(注意
符号)


它会起作用的。如前所述,没有这些内存分配,这两个指针不会指向任何有效内存。它们是未初始化的,像您那样访问它们是未定义的行为。实践中通常发生的情况是,它试图将垃圾值解释为地址,并试图访问该地址,这导致了分段错误。

realresult和imaginaryresult在主函数中被用作指针。它们应该只是浮点变量,您应该将这些变量的地址传递给相应的函数。更改以下行

float *realresult;
float *imaginaryresult;

此外,函数调用需要修改为

add(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
...
subtract(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
....
multiply(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);

imaginaryresult
从不指向任何确定的内存。你没把它初始化。坦白地说,它不应该是一个指针,而应该是
main
。它应该是一个常规的
float
,并且您应该将它的地址传递给您的函数。同样,对于
realresult
。正如@WhozCraig所写的,即使这些参数在语义上是“out”参数,它们仍然需要在某处分配存储空间。而且你的函数不会动态地分配
add(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
...
subtract(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);
....
multiply(realone, imaginaryone, realtwo, imaginarytwo, &realresult, &imaginaryresult);