2014-10-04 4 views
-2

Следующий код - это решение проблемы поиска дружественных пар между номерами ввода. Я еще не знаю, насколько наилучшим может быть алгоритм, но в чем заключается моя проблема, так это то, что приведенный ниже код продолжает возвращать ошибку сегментации: 11. Я проверяю, и он даже не попадает в цикл for в функции readNums. Какие-либо предложения, что не так?Получение ошибки сегментации: 11 в C. Почему?

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

/*saves memory for a given length */ 
int *saveMemory(int sz) { 
    int *ptr = calloc(sz, sizeof(int)); 
    if (ptr == NULL) { 
    printf("Error: memory allocation failed (out of memory?).\n"); 
    exit(-1); 
    } 
    return ptr; 
} 

int *readNums(int length){ 

    int *nums = saveMemory(length), i; 

    for (i = 0; i < length; i++){ 
    scanf("%d", &nums[i]); 

    } 
    return nums; 

} 

int divArr (int n) { 
int i=0; 

int j; 
    int *arr = saveMemory(sizeof(arr)*4); 

    for (j=1; j<n; j++) { 

    if (n%j==0){ 
     arr[i]=j; 
     i++; 
    } 


    } 

    return arr; 

} 

int sumDiv (int *arr){ 
int sum, i; 

for (i=0; i< sizeof(arr); i++){ 

    sum += arr[i]; 
    } 

    return sum; 
} 


int main(int argc, char *argv[]) { 
    int i, j, k, length; 
    int *nums; 

    printf("Please give me the length \n"); 
    scanf("%d", &length); 
    printf("Please type in the numbers to be checked \n"); 
    nums = readNums(length); 



    for (k=0; k<length-1; k++) { 
    int a,b; 
    int *arr; 
    a=divArr(nums[i]); 
    b=divArr(nums[k]); 

    if (((sumDiv(a)) == nums[k]) && ((sumDiv(b)) == nums[i])) { 

     printf("%d %d \n", i, j); 


    } else { 
     i++; 

    } 

    } 


} 
+0

, Что ваш вход и ожидаемые результаты? – smushi

+4

'a = divArr (nums [i]);': 'i' не инициализируется. – BLUEPIXY

+2

'sumDiv' is bad: он всегда суммирует первые' sizeof (int *) 'элементы переданного массива. Кроме того, в 'main' есть много неинициализированных переменных, один из которых назван BLUEPIXY. Вы скомпилировали его с включенными предупреждениями? '-Wall -Werror -pedantic'? – Deduplicator

ответ

0
  1. изменение INT divArr (Int N) для Int * divArr (Int N).
  2. изменить int a, b; к int * a, * b; в основном.

Я не проверял логика

Смежные вопросы