Ошибка чтения переменной, невозможно получить доступ к памяти - PullRequest
0 голосов
/ 22 октября 2018

Я пытался решить мою проблему с помощью предыдущей темы, но не смог применить ее к моей ситуации, вот код для рекурсивного нахождения максимума массива в массиве в c.Отладка выдает ошибку

Программа получила сигнал SIGSEGV, ошибка сегментации.
0x0000000000400682 в maxarray (arr = 0x7fffffffeb30, n = 10, i = 0,
максимум =)at 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 голосов
/ 22 октября 2018

Я сохранил вашу программу практически без изменений;просто перенастроил 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
0 голосов
/ 22 октября 2018

Выражение i++ возвращает значение i и , затем увеличивает его.

maxarray(arr, n, i++, maximum) продолжает вызывать себя с помощью i = 0, и вы в конечном счете исчерпываете стек вызововпамять.

Вы можете просто использовать i + 1, поскольку нет смысла изменять i в этой области, или использовать ++i.

Также вы просто игнорируете возвращаемое значениевызовы рекурсии, эта рекурсия, даже если она работала, ничего не делает.

...