使用不同功能时出现分段错误

时间:2017-03-02 02:45:02

标签: c

我试图通过使用函数更整齐地分离我的代码。我遇到的一个问题是通过不同的函数传递变量。如果我将所有代码留在我的工作函数中,它将运行没有问题。当我创建另一个函数并将变量传递给该函数时,我就会遇到问题。

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

int main(void)
{    
    workings();
    output();
}

void workings()
{   
    int x;
    int i;

    double total = 0;
    double squareRoot;
    double overall;

    scanf("%d", &x);

    int* array = malloc(x * sizeof(int));

    if (!array) {
        printf("There isn't enough memory \n");
        return;
    }

    int j = 0;

    while (j < x) {   
        scanf("%d", &array[j]);
        total += array[j] * array[j];
        j++;
    }

    squareRoot = sqrt(total);
}

void output(int x, double overall, double squareRoot, int* array)
{
    int k = 0;

    while (k < x) {
        overall = array[k] / squareRoot;
        printf("%.3f ", overall);
        k++;
    }
}

1 个答案:

答案 0 :(得分:2)

您必须将参数传递给需要它们的函数。

试试这个:

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

void workings(int *x_out, double *squareRoot_out, int** array_out);
void output(int x, double squareRoot, int* array);

int main(void)
{
    int x;
    double squareRoot;
    int* array;

    workings(&x, &squareRoot, &array);
    output(x, squareRoot, array);
}

void workings(int *x_out, double *squareRoot_out, int** array_out)
{

    int x;

    double total = 0;
    double squareRoot;

    scanf("%d", &x);

    int* array = malloc(x * sizeof(int));

    if (!array) {
        printf("There isn't enough memory \n");
        return;
    }

    int j = 0;

    while (j < x) {

        scanf("%d", &array[j]);

        total += array[j] * array[j];
        j++;
    }

    squareRoot = sqrt(total);

    /* pass data for later use to callee */
    *x_out = x;
    *squareRoot_out = squareRoot;
    *array_out = array;
}
void output(int x, double squareRoot, int* array)
{
    double overall;
    int k = 0;

    while (k < x) {

        overall = array[k] / squareRoot;
        printf("%.3f ", overall);

        k++;
    }
}

我所做的改变是:

  • 添加要在main()之前使用的函数的原型声明(使用函数的地方)。
    这是为了安全:编译器在知道声明和函数定义之前不能检查参数。
  • workings()添加参数,以便导出函数中使用的数据。
  • 使用参数导出数据。
  • 删除overall中的变量iworkings(),因为它们未被使用。
  • overall函数中删除output()参数,并将其声明为局部变量,因为未使用该输入。
  • 修改main()函数以分配内存以传递数据并在函数之间传递数据。