为什么在下面的C代码中出现分段错误?

时间:2016-09-04 20:39:55

标签: c

问题在于数组中的左旋转。

第一行包含两个以空格分隔的整数,表示n(整数)和d(必须执行的左旋转数)的相应值。 第二行包含n以空格分隔的整数,用于描述数组初始状态的各个元素。

我的解决方案:

#include <stdio.h>
#include <malloc.h>

int main() {
    int n, d, i;
    scanf("%d %d", &n, &d);
    int *a = (int *)malloc(sizeof(int) * n);
    int *temp = (int *)malloc(sizeof(int) * d);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < d; i++)
        temp[i] = a[i];
    for (i = 0; i < n - d; i++)
        a[i] = a[i + d];
    for (i = 0; i < n; i++)
        a[i + n - d] = temp[i];
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

首先,您在代码中进行了隐式断言

for(i=0;i<n;i++)
  scanf("%d",&a[i]);
for(i=0;i<d;i++)
  temp[i]=a[i];
            ^
      d should be <= n

错误:如果d > n您正在分配区域中进行读取访问。

中的同样问题
for(i=0;i<n;i++)
  a[i+n-d]=temp[i];
      ^         ^
2*n-d <= n and n <= d
    n >= d for i = 0

malloc调用之前的代码应该在条件

下执行
if (n > 0 && d > 0 && n < ... && d < ...)

我认为您可以假设d = n编写算法的第一个版本。

答案 1 :(得分:0)

如果d > n代码总是失败,但如果d < n代码也失败:第四个for循环不正确,它应该停在d

for (i = 0; i < d; i++)
    a[i + n - d] = temp[i];