【问题标题】:Getting segmentation fault:11 in C. Why?在 C 中出现分段错误:11。为什么?
【发布时间】:2014-11-29 09:43:10
【问题描述】:

以下代码是解决在输入数字之间寻找友好配对问题的解决方案。我还不知道算法是否是最好的,但我的问题正是下面的代码不断返回分段错误:11。我检查了一下,它甚至没有进入 readNums 函数中的 for 循环。有什么建议吗?

#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++;

    }

  }


}

【问题讨论】:

  • 您的输入和预期输出是什么?
  • a=divArr(nums[i]); : i 未初始化。
  • sumDiv 不好:它总是对传递数组的第一个 sizeof(int*) 元素求和。此外,main 中还有很多未初始化的变量,其中一个被 BLUEPIXY 命名。您是否在启用所有警告的情况下编译它? -Wall -Werror -pedantic?
  • 你为什么要分配一个比你显然需要的数组元素数量多四倍的数组? int *arr = saveMemory(sizeof(arr)*4);你忘了calloc已经知道int的大小了吗?
  • int *arr = saveMemory(sizeof(arr)*4); 应该是 int *arr = saveMemory(sizeof(*arr)*(n-1)); 也应该是 return arr;arr 的类型不是 int

标签: c dynamic-allocation calloc


【解决方案1】:
  1. 将 int divArr (int n) 更改为 int *divArr (int n)。
  2. 改变int a,b;到 int *a,*b;主要。

我没有检查你的逻辑

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2018-04-10
    • 2022-01-14
    • 2011-04-23
    相关资源
    最近更新 更多