2014-10-04 52 views
-2

以下代碼是查找輸入數字之間的友好對的問題的解決方案。我還不知道算法是否是最好的,但我的問題恰恰是下面的代碼一直在返回分段錯誤:11。我檢查並且它甚至沒有進入readNums函數中的for循環。任何建議有什麼不對?分段故障:C中爲11爲什麼?

#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 2014-10-04 15:09:47

+4

'a = divArr(nums [i]);':'i'沒有初始化。 – BLUEPIXY 2014-10-04 15:11:07

+2

'sumDiv'很糟糕:它始終總和傳遞數組的第一個'sizeof(int *)'元素。另外,'main'中有許多未初始化的變量,其中一個以BLUEPIXY命名。你是否啓用了所有警告進行編譯? ' - 牆 - 錯誤 - ped''? – Deduplicator 2014-10-04 15:12:01

回答

0
  1. 變化INT divArr(INT N)到int * divArr(中間體N)。
  2. change int a,b;以int * a,* b;主要。

我沒有檢查你的邏輯