2016-09-04 16 views
-3

問題は配列の左回転です。Cコードの下にセグメンテーションフォルトがあるのはなぜですか?

最初の行には、それぞれの値がn(整数)およびd(実行する必要がある左回転数)という2つのスペース区切りの整数が含まれています。 2行目には、配列の初期状態の各要素を記述する、スペースで区切った整数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; 
} 
+0

あなたは 'scanf'の戻り値を無視しています。致命的な論理欠陥。 –

+1

入力とは何ですか? d> nのときは、常にSIGSEGVを取得します。 – 4pie0

+1

デバッガを使用します。 debug printfsを使用してください。基本的なデバッグ手法を学ぶ(すぐに投稿することは、多くの人が考えているように見えるにもかかわらず、大きなデバッグ手法ではありません)。関連する言語タグのみを選択してください。 CとC++は同じ言語ではありません。 – kaylum

答えて

0

あなたのコードは、いくつかの問題を抱えています。あなたが割り当てられたゾーンの外にリードアクセスを行っているd > n場合:

まず、あなたは間違っているコード内の暗黙のアサーション

for(i=0;i<n;i++) 
    scanf("%d",&a[i]); 
for(i=0;i<d;i++) 
    temp[i]=a[i]; 
      ^
     d should be <= 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をとることができると思います。 d > n場合

0

コードは常に失敗しますが、それはまた、d < n次の場合に失敗します。第四forループが間違っている、それはdで停止する必要があります

for (i = 0; i < d; i++) 
    a[i + n - d] = temp[i]; 
関連する問題