错误读取变量,无法访问内存

时间:2018-10-21 22:57:41

标签: c memory segmentation-fault

我试图用一个先例主题解决我的问题,但不适用于我的情况,这是一个代码,用于在c中的数组中递归查找数组的最大值。调试给出错误

  
    

程序收到信号SIGSEGV,分段错误。
    maxarray中的0x0000000000400682(arr = 0x7fffffffeb30,n = 10,i = 0,
        maximum =)在main.c:23

  

有一个最大的地址,我不明白为什么它不能访问它。

#include <stdio.h>

int maxarray ( int arr[], int n , int i, int maximum);

int main(void){
    int arr[10];
    int maximum = 0;
    puts("the array is");
    for (size_t i=0; i<10; ++i) {
    arr[i]=(rand()%10);
    printf("%d ",arr[i]);
    }
    printf("the maximum is %d",  maxarray(arr,10,0,maximum));
    return 0;
}

int maxarray (int arr[10], int n, int i, int maximum){
    if (i<10){
        if (maximum<arr[i]){
            maximum=arr[i];
        }
        maxarray(arr, n, i++, maximum);
        }
    else{
    return maximum;
    }
}

2 个答案:

答案 0 :(得分:0)

表达式i++返回i的值,然后然后将其递增。

maxarray(arr, n, i++, maximum)不断使用i = 0进行调用,最终导致调用堆栈内存不足。

您可以简单地使用i + 1,因为没有理由在此范围内修改i或使用++i

您也可以简单地忽略递归调用的返回值,即使该递归正在工作,它也无济于事。

答案 1 :(得分:-1)

我实际上使您的程序保持不变;只是重新跳动maxarray而不是递归。

#include <stdio.h>

int maxarray (int arr[], int size, int maximum);

int main(void){
    int arr[10];
    int maximum = 0;
    int size = sizeof(arr) / sizeof(int);
    printf("the array is: ");
    for (size_t i=0; i<10; ++i) {
        arr[i]=(rand()%10);
        printf("%d ",arr[i]);
    }
    printf("\n");
    printf("the maximum is %d", maxarray(arr, size, maximum));
    return 0;
}

int maxarray (int arr[], int size, int maximum){
    printf("sizeof(arr) is: %lld \n", size);
    for(int i=0; i<size; i++)
    {
      if (maximum<arr[i]){
          maximum=arr[i];
      }
    }
    return maximum;
}

输出:

the array is: 3 6 7 5 3 5 6 2 9 1                                                                                                                                                                                                                                                                            
sizeof(arr) is: 10                                                                                                                                                                                                                                                                                           
the maximum is 9