时间:2018-11-29 19:37:03

标签: c pointers null

有人可以告诉我为什么会出现此细分错误吗? 是否因为我将指针设置为NULL并将其传递给函数? 我要发送数组以使用函数时应该使用数组还是指针?

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

int* ComputeFibo(int _size);
void PrintFibo(int* _arr, int _size);


int main (int argc, char* argv[])
{
    int* arr = NULL; 
    int n = 0;

    printf("Please enter Fibonacci size:"); 
    scanf("%d", &n);

    arr = ComputeFibo(n);

    PrintFibo(arr, n);

    return 0;
}


int* ComputeFibo(int _size)
{
    int sum = 0;
    int indx = 0;
    int* arr = NULL;

    arr[indx] = 1;

    for (indx = 1; indx < _size; ++indx)
    {
        arr[indx] = arr[indx - 1] + sum;
        sum = arr[indx - 1];
    }

    return arr;
}


void PrintFibo(int* _arr, int _size)
{
    int indx = 0;

    for (; indx < _size; ++indx)
    {
        printf("%d\t", _arr[indx]);
    }
}

我希望得到一个很好的解释答案。

2 个答案:

答案 0 :(得分:3)

有问题的陈述是:

   int* arr = NULL;

其中arr指向NULL,然后将值分配给arr,就好像它指向有效的内存位置一样。

您可以通过以下方式修复它:

   int* arr = malloc(_size * sizeof *arr);
   if (arr == NULL) {  /* error *}

,然后稍后在返回的指针上调用free()

    arr = ComputeFibo(n);
    PrintFibo(arr, n);
    free(arr);

另外请注意,int只能表示C中的有限值。因此,例如,如果您尝试计算多达100个斐波那契数,则很可能会遇到integer overflow

答案 1 :(得分:0)

您尝试访问Matrix指针的索引。

null

如果您想要参考,我已修复您的代码。

int* ComputeFibo(int _size)
{
    int* arr = NULL;

    arr[indx] = 1; //SIGF
...
}

输出:

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

void compute_fibo(int *_arr, int _size);

void print_fibo(int *_arr, int _size);


int main(int argc, char *argv[]) {
    int n = 0;

    printf("Please enter Fibonacci size:");
    scanf("%d", &n);

    int *arr = (int *) malloc(sizeof(int) * n);
    if (arr == NULL) return 1;

    compute_fibo(arr, n);

    print_fibo(arr, n);

    free(arr);
    return 0;
}


void compute_fibo(int *_arr, int _size) {
    _arr[0] = 1;
    _arr[1] = 1;

    for (int index = 2; index < _size; index++) {
        _arr[index] = _arr[index - 1] + _arr[index - 2];
    }
}


void print_fibo(int *_arr, int _size) {
    for (int index = 0; index < _size; ++index) {
        printf("%d\t", _arr[index]);
    }
}